Las uniones te permiten conectar diferentes vistas para que puedas explorar datos de más de una vista al mismo tiempo y ver cómo las distintas partes de tus datos se relacionan entre sí.
Por ejemplo, tu base de datos podría incluir las tablas order_items
, orders
y users
. Puedes usar uniones para explorar datos de todas las tablas al mismo tiempo. En esta página, se explican las uniones en LookML, incluidos los parámetros de unión específicos y los patrones de unión.
Las uniones comienzan con una exploración
Las uniones se definen en el archivo del modelo para establecer la relación entre una exploración y una vista. Las uniones conectan una o más vistas a una sola exploración, ya sea directamente o a través de otra vista unida.
Considera dos tablas de base de datos: order_items
y orders
. Después de generar vistas para ambas tablas, declara una o más de ellas en el parámetro explore
en el archivo de modelo:
explore: order_items { ... }
Cuando ejecutas una consulta desde la exploración order_items
, order_items
aparece en la cláusula FROM
del SQL generado:
SELECT ...
FROM order_items
Puedes agregar información adicional a la exploración de order_items
. Por ejemplo, puedes usar el siguiente LookML de muestra para unir la vista orders
a la exploración order_items
:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
}
El LookML que se mostró antes logra dos cosas. Primero, puedes ver los campos de orders
y order_items
en el selector de campos de exploración:
En segundo lugar, LookML describe cómo unir orders
y order_items
. Ese LookML se traduciría en el siguiente SQL:
SELECT ...
FROM order_items
LEFT JOIN orders
ON order_items.order_id = orders.id
Estos parámetros de LookML se describen con más detalle en las siguientes secciones.
Parámetros de unión
Se usan cuatro parámetros principales para unir: join
, type
, relationship
y sql_on
.
Paso 1: Comenzar la exploración
Primero, crea la exploración order_items
:
explore: order_items { ... }
Paso 2: join
Para unir una tabla, primero debes declarar la tabla en una vista. En este ejemplo, supongamos que orders
es una vista existente en tu modelo.
Luego, usa el parámetro join
para declarar que deseas unir la vista orders
a la exploración order_items
:
explore: order_items {
join: orders { ... }
}
Paso 3: type
Considera qué tipo de combinación realizar. Looker es compatible con LEFT JOIN
, INNER JOIN
, FULL OUTER JOIN
y CROSS JOIN
. Estos corresponden a los valores del parámetro type
de left_outer
, inner
, full_outer
y cross
.
explore: order_items {
join: orders {
type: left_outer
}
}
El valor predeterminado de type
es left_outer
.
Paso 4: relationship
Define una relación de unión entre la exploración order_items
y la vista orders
. Es importante que Looker declare de forma correcta la relación entre una unión para calcular mediciones precisas. La relación se define desde la exploración order_items
hasta la vista orders
. Las opciones posibles son one_to_one
, many_to_one
, one_to_many
y many_to_many
.
En este ejemplo, puede haber muchos artículos de pedido para un solo pedido. La relación entre la exploración order_items
y la vista orders
es many_to_one
:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
}
}
Si no incluyes un parámetro relationship
en tu unión, Looker se configura de forma predeterminada en many_to_one
.
Si deseas obtener sugerencias adicionales sobre cómo definir el parámetro relationship
de forma correcta para una unión, consulta Cómo obtener el parámetro relationship
correctamente.
Paso 5: sql_on
Declara cómo unir la tabla order_items
y la tabla orders
junto con los parámetros sql_on
o foreign_key
.
El parámetro sql_on
es equivalente a la cláusula ON
en el SQL generado para una consulta. Con este parámetro, puedes declarar qué campos deben coincidir para realizar la unión:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
}
También puedes escribir uniones más complejas. Por ejemplo, es posible que quieras unir solo pedidos con id
mayores que 1,000:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} AND ${orders.id} > 1000 ;;
}
}
Consulta la documentación de operadores de sustitución para obtener más información sobre la sintaxis ${ ... }
en estos ejemplos.
Paso 6: Prueba
Ve a la exploración Order Items para probar que esta unión funcione según lo esperado. Deberías ver los campos de order_items
y orders
.
Consulta Cómo editar y validar LookML para obtener más información para probar los cambios de LookML en una exploración.
Cómo unirse desde otra vista
Puedes unir una vista a una exploración a través de otra vista. En el ejemplo de parámetros de unión, uniste orders
a order_items
a través del campo order_id
. También es posible que queramos unir los datos de una vista llamada users
a la exploración de order_items
, aunque no compartan un campo común. Para ello, únete a través de la vista orders
.
Usa el parámetro sql_on
o el parámetro foreign_key
para unir la vista users
a la vista orders
, en lugar de a la exploración order_items
. Para ello, define el alcance del campo de orders
como orders.user_id
de forma correcta.
El siguiente es un ejemplo en el que se usa el parámetro sql_on
:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
join: users {
type: left_outer
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id} ;;
}
}
Cómo unirse a una vista más de una vez
Una vista users
contiene datos tanto para compradores como para vendedores. Para unir los datos de esta vista en order_items
, pero de manera independiente para los compradores y vendedores, puedes unir users
dos veces, con nombres diferentes, mediante el parámetro from
.
El parámetro from
te permite especificar qué vista usar en una unión y le da un nombre único. Por ejemplo:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
join: buyers {
from: users
type: left_outer
relationship: many_to_one
sql_on: ${orders.buyer_id} = ${buyers.id} ;;
}
join: sellers {
from: users
type: left_outer
relationship: many_to_one
sql_on: ${orders.seller_id} = ${sellers.id} ;;
}
}
En este caso, solo los datos del comprador se unen como buyers
, mientras que solo los datos del vendedor se unen como sellers
.
Nota: Ahora se debe hacer referencia a la vista users
mediante sus nombres con alias buyers
y sellers
en la unión.
Limita los campos de una unión
El parámetro fields
te permite especificar qué campos se derivan de una unión a una exploración. De forma predeterminada, todos los campos de una vista se incorporan cuando se unen. Sin embargo, es posible que desees procesar solo un subconjunto de campos.
Por ejemplo, cuando orders
se une a order_items
, es posible que quieras pasar solo los campos shipping
y tax
a través de la unión:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
fields: [shipping, tax]
}
}
También puedes hacer referencia a un conjunto de campos, como [set_a*]
. Cada conjunto se define dentro de una vista con el parámetro set
. Supongamos que tienes el siguiente conjunto definido en la vista orders
:
set: orders_set {
fields: [created_date, shipping, tax]
}
Puedes elegir pasar solo estos tres campos cuando unes orders
a order_items
:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
fields: [orders_set*]
}
}
Agregados simétricos
Looker usa una función llamada “agregados simétricos” para calcular agregaciones (como sumas y promedios) de forma correcta, incluso cuando las uniones generan una distribución. Las agregaciones simétricas se describen con más detalle en Comprende las agregaciones simétricas. El problema de fanout que resuelven los agregados simetrizados se explica en la publicación de Comunidad The problem of SQL fanouts.
Claves primarias obligatorias
Para que las mediciones (agregaciones) se realicen a través de uniones, debes definir claves primarias en todas las vistas que forman parte de la unión.
Para ello, agrega el parámetro primary_key
a la definición del campo de clave primaria en cada vista:
dimension: id {
type: number
primary_key: yes
}
Dialectos de SQL compatibles
Para que Looker admita agregaciones simétricas en tu proyecto de Looker, el dialecto de tu base de datos también debe admitirlos. En la siguiente tabla, se muestra qué dialectos admiten agregaciones simétricas en la versión más reciente de Looker:
Dialecto | ¿Es compatible? |
---|---|
Avalancha de Actian | Sí |
Amazon Athena | Sí |
Amazon Aurora MySQL | Sí |
Amazon Redshift | Sí |
Apache Druid | No |
Apache Druid 0.13 y versiones posteriores | No |
Apache Drued 0.18 y versiones posteriores | No |
Apache Hive 2.3 o versiones posteriores | No |
Apache Hive 3.1.2 o versiones posteriores | No |
Apache Spark 3 y versiones posteriores | Sí |
ClickHouse | No |
Cloudera Impala 3.1 y versiones posteriores | Sí |
Cloudera Impala 3.1+ con Native Drive | Sí |
Cloudera Impala con Native Driver | No |
DataVirtuality | Sí |
Databricks | Sí |
Denodo 7 | Sí |
Denodo 8 | Sí |
Dremio | No |
Dremio 11 y versiones posteriores | Sí |
Exasol | Sí |
Rayo de fuego | Sí |
SQL heredado de Google BigQuery | Sí |
SQL estándar de Google BigQuery | Sí |
Google Cloud PostgreSQL | Sí |
Google Cloud SQL | Sí |
Google Spanner | Sí |
Ciruela verde | Sí |
HyperSQL | No |
IBM Netezza | Sí |
MariaDB | Sí |
Microsoft Azure PostgreSQL | Sí |
Base de datos de Microsoft Azure SQL | Sí |
Microsoft Azure Synapse Analytics | Sí |
Microsoft SQL Server 2008 y versiones posteriores | Sí |
Microsoft SQL Server 2012 y versiones posteriores | Sí |
Microsoft SQL Server 2016 | Sí |
Microsoft SQL Server 2017 y versiones posteriores | Sí |
MongoBI | No |
MySQL | Sí |
MySQL 8.0.12 o versiones posteriores | Sí |
Oracle | Sí |
ADWC de Oracle | Sí |
PostgreSQL 9.5 y versiones posteriores | Sí |
PostgreSQL anterior a la 9.5 | Sí |
PrestoDB | Sí |
PrestoSQL | Sí |
SAP HANA 2 y versiones posteriores | Sí |
SingleStore | Sí |
SingleStore 7+ | Sí |
Snowflake | Sí |
Teradata | Sí |
Trino | Sí |
Vector | Sí |
Vertica | Sí |
Si tu dialecto no admite agregaciones simétricas, ten cuidado cuando ejecutes uniones en Looker, ya que algunos tipos de uniones pueden dar como resultado agregaciones imprecisas (como sumas y promedios). Este problema y las soluciones alternativas se describen con gran detalle en la publicación de Comunidad The problem of SQL fanouts.
Más información sobre las uniones
Para obtener más información sobre los parámetros de unión en LookML, consulta la documentación de referencia de unión.