Conceptos de SQL para combinaciones

Al igual que en SQL, una unión en LookML se usa para combinar filas de dos o más tablas en función de una columna relacionada entre ellas.

En LookML, una Exploración, definida por el parámetro de LookML explore, se usa para definir cómo puede consultar los datos un usuario. Una exploración consta de al menos una vista o de un conjunto de vistas combinadas. La vista principal de Explorar siempre se incluye en la consulta. Las vistas combinadas normalmente solo se incluyen si son necesarias para satisfacer la consulta.

Una vista de LookML corresponde a una tabla de SQL (u otro elemento que tenga la estructura de una tabla) de la base de datos o a una tabla derivada. La vista define qué campos o columnas están disponibles en la base de datos y cómo se debe acceder a ellos.

El siguiente ejemplo es una definición de la exploración orders.

explore: orders {
  join: users {
    type: left_outer
    sql_on: ${orders.user_id} = ${users.id} ;;
    relationship: many_to_one
  }
}

La vista orders, que es la vista principal de Explorar, se une a la vista users con un SQL LEFT OUTER JOIN, tal como indica el parámetro de LookML type: left_outer. La cláusula SQL ON, que se define mediante el parámetro de LookML sql_on, no usa table_alias.column, sino que hace referencia a to ${view_name.field_name}. De esta forma, si el nombre de la tabla o de la columna cambia en la base de datos, solo tendrá que hacer el cambio en un lugar.

El parámetro relationship es importante. Las combinaciones pueden causar problemas de fanout, en los que se duplican las filas. Al especificar que muchos pedidos se unirán a un solo usuario, Looker reconoce que no se producirán fanouts a partir de esta unión, por lo que no es necesario un tratamiento especial. Sin embargo, las relaciones one_to_many pueden activar una distribución.

La generación automática de vistas y Exploraciones usa de forma predeterminada una unión externa izquierda. Sin embargo, en el ejemplo anterior, es muy probable que cada pedido tenga exactamente un usuario, por lo que la unión de este ejemplo puede ser una unión interna.

Para ver el código SQL generado de un Exploración, puedes ejecutarlo en la interfaz de usuario y, a continuación, seleccionar la pestaña SQL del panel Datos.

Por ejemplo, si abre la exploración Pedidos, que se ha definido anteriormente, y selecciona los campos ID de usuario y Recuento, el código SQL generado será similar al siguiente:

SELECT
    `user_id` AS `orders.user_id`,
    COUNT(*) AS `orders.count`
FROM
    `thelook`.`orders` AS `orders`
GROUP BY
    1
ORDER BY
    2 DESC
LIMIT 500

En este ejemplo, no se hace referencia a la tabla de usuarios. Solo se incluye si es necesario.

Si quita la dimensión ID de usuario y añade la dimensión ID de la vista Usuarios, el código SQL será similar al siguiente:

SELECT
    `users`.`id` AS `users.id`,
    COUNT(*) AS `orders.count`
FROM
    `thelook`.`orders` AS `orders`
    INNER JOIN `thelook`.`users` AS `users` ON `orders`.`user_id` = `users`.`id`
GROUP BY
    1
ORDER BY
    2 DESC
LIMIT 500

En este caso, como hay una selección en la vista Usuarios, se incluye la combinación.

En el siguiente ejemplo se muestra el LookML del archivo orders Exploración, que se definió anteriormente, y se añade una combinación a la vista order_items:

explore: orders {
  join: users {
    type: inner
    sql_on: ${orders.user_id} = ${users.id} ;;
    relationship: many_to_one
  }
  join: order_items {
    type: inner
    sql_on: ${orders.id} = ${order_items.order_id} ;;
    relationship: one_to_many
  }
}

Ahora, si abre la sección Pedidos de Explorar en la interfaz de usuario, verá la vista Elementos de pedido. Si selecciona la medida Precio de venta total de la vista Artículos de pedido junto con Recuento de Pedidos e ID de Usuarios, Looker genera el siguiente SQL:

SELECT
    `users`.`id` AS `users.id`,
    COUNT(DISTINCT orders.id ) AS `orders.count`,
    COALESCE(SUM(`order_items`.`sale_price`), 0) AS `order_items.total_sale_price`
FROM
    `thelook`.`orders` AS `orders`
    INNER JOIN `thelook`.`users` AS `users` ON `orders`.`user_id` = `users`.`id`
    INNER JOIN `thelook`.`order_items` AS `order_items` ON `orders`.`id` = `order_items`.`order_id`
GROUP BY
    1
ORDER BY
    2 DESC
LIMIT 500

En este ejemplo, COUNT(*) AS orders.count se ha convertido en COUNT(DISTINCT orders.id ) AS orders.count. Looker ha detectado que había una posible situación de fanout y ha añadido automáticamente la palabra clave SQL DISTINCT a la función SQL COUNT.