Uso
join: view_name { ... }
}
Jerarquía
join |
Valor predeterminado
NingunaAcepta
El nombre de una vista existenteReglas especiales
|
Definición
join
te permite definir la relación de unión entre una Explorar y una vista, de modo que puedas combinar datos de varias vistas. Puedes unirte a todas las vistas que quieras para una exploración determinada.
Recuerde que cada vista está asociada con una tabla en su base de datos o con una tabla derivada que haya definido en Looker. Del mismo modo, como Explorar está asociado con una vista, también se conecta a una tabla de algún tipo.
La tabla asociada con Explorar se coloca en la cláusula FROM
del SQL que genera Looker. Las tablas asociadas con las vistas unidas se colocan en la cláusula JOIN
del SQL que genera Looker.
Parámetros de unión principales
Para definir la relación de unión (la cláusula ON
de SQL) entre una exploración y una vista, deberás usar join
en combinación con otros parámetros.
Es necesario que uses el parámetro sql_on
o foreign_key
para establecer la cláusula ON
de SQL.
También deberás asegurarte de usar las relaciones y los tipos de unión adecuados, aunque no siempre se requieren explícitamente los parámetros type
y relationship
. Si los valores predeterminados de type: left_outer
y relationship: many_to_one
son apropiados para tu caso de uso, se pueden excluir estos parámetros.
Estos parámetros clave, y su relación con el SQL que genera Looker, se muestran aquí:
sql_on
sql_on
te permite establecer una relación de unión mediante la escritura directa de la cláusula ON
de SQL. Puede realizar las mismas uniones que foreign_key
, pero es más fácil de leer y comprender.
Consulta la página de documentación del parámetro sql_on
para obtener más información.
foreign_key
foreign_key
le permite establecer una relación de unión mediante la clave primaria de la vista unida y conectarla con una dimensión en Explorar. Este patrón es muy común en el diseño de bases de datos, y foreign_key
es una forma elegante de expresar la unión en estos casos.
Para comprender todo, consulta la página de documentación del parámetro foreign_key
.
type
La mayoría de las uniones en Looker son LEFT JOIN
por los motivos que se analizan en la sección No aplicar la lógica empresarial en las uniones si es posible en esta página. Por lo tanto, si no agregas un type
de forma explícita, Looker supondrá que deseas un LEFT JOIN
. Sin embargo, si necesitas otro tipo de unión por algún motivo, puedes hacerlo con type
.
Para obtener una explicación completa, consulta la página de documentación del parámetro type
.
relationship
En el diagrama anterior, relationship
no tiene un impacto directo en el SQL que genera Looker, pero es fundamental para el funcionamiento adecuado de Looker. Si no agregas explícitamente un relationship
, Looker supondrá que es many-to-one
, lo que significa que muchas filas en Explorar pueden tener una fila en la vista unida. No todas las uniones tienen este tipo de relación, y aquellas con otras relaciones deben declararse correctamente.
Para comprender todo, consulta la página de documentación del parámetro relationship
.
Ejemplos
Únete a la vista llamada customer
en la pestaña Explorar llamada order
, donde está la relación de unión
FROM order LEFT JOIN customer ON order.customer_id = customer.id
:
explore: order {
join: customer {
foreign_key: customer_id
relationship: many_to_one # Could be excluded since many_to_one is the default
type: left_outer # Could be excluded since left_outer is the default
}
}
-
Únete a la vista llamada address
en la pestaña Explorar llamada person
, donde está la relación de unión
FROM person LEFT JOIN address ON person.id = address.person_id
AND address.type = 'permanent'
:
explore: person {
join: address {
sql_on: ${person.id} = ${address.person_id} AND ${address.type} = 'permanent' ;;
relationship: one_to_many
type: left_outer # Could be excluded since left_outer is the default
}
}
-
Únete a la vista llamada member
en la pestaña Explorar llamada event
, donde está la relación de unión
FROM event INNER JOIN member ON member.id = event.member_id
:
explore: event {
join: member {
sql_on: ${event.member_id} = ${member.id} ;;
relationship: many_to_one # Could be excluded since many_to_one is the default
type: inner
}
}
-
Desafíos habituales
join
debe usar nombres de vista y no nombres de tablas subyacentes
El parámetro join
solo toma un nombre de vista, no el nombre de tabla asociado a esa vista. A menudo, el nombre de la vista y el nombre de la tabla son idénticos, lo que puede llevar a la conclusión falsa de que se pueden usar.
Algunos tipos de medidas requieren agregaciones simétricas
Si no usas agregados simétricos, la mayoría de los tipos de medición se excluyen de las vistas unidas. Para que Looker admita agregaciones simétricas en tu proyecto de Looker, tu dialecto de base de datos también debe admitirlas. En la siguiente tabla, se muestra qué dialectos admiten agregaciones simétricas en la versión más reciente de Looker:
Sin las agregaciones simétricas, las relaciones de unión que no son uno a uno pueden crear resultados imprecisos en funciones agregadas. Dado que las mediciones de Looker son funciones agregadas, solo las medidas de type: count
(como COUNT DISTINCT
) se extraen de las vistas unidas a Explorar. Si tienes una relación de unión uno a uno, puedes usar el parámetro relationship
para forzar la inclusión de los otros tipos de medición, como se muestra a continuación:
explore: person {
join: dna {
sql_on: ${person.dna_id} = ${dna.id} ;;
relationship: one_to_one
}
}
Los motivos por los que Looker funciona de esta manera (para los dialectos que no admiten agregaciones simétricas) se analizan con más detalle en el artículo El problema de las distribuciones de SQL del Centro de ayuda.
Qué debes saber
Puedes unirte a la misma tabla más de una vez con from
En los casos en los que una sola tabla contiene diferentes tipos de entidades, es posible unir una vista a una exploración más de una vez. Para ello, deberás usar el parámetro from
. Supongamos que tienes una exploración de order
y necesitas unir una vista de person
dos veces: una para el cliente y una para el representante de servicio al cliente. Puedes hacer algo como esto:
explore: order {
join: customer {
from: person
sql_on: ${order.customer_id} = ${customer.id} ;;
}
join: representative {
from: person
sql_on: ${order.representative_id} = ${representative.id} ;;
}
}
Si es posible, no aplique la lógica empresarial en las uniones.
El enfoque estándar de Looker para unirse es usar un LEFT JOIN
siempre que sea posible. Considere un enfoque diferente si tiene que hacer algo similar a lo siguiente:
explore: member_event {
from: event
always_join: [member]
join: member {
sql_on: ${member_event.member_id} = ${member.id} ;;
type: inner
}
}
-
En este ejemplo, creamos un objeto Explorar que solo analiza los eventos asociados con los miembros conocidos. Sin embargo, la forma preferida de ejecutar esto en Looker sería usar un LEFT JOIN
para obtener datos de eventos y datos de miembros juntos de la siguiente manera:
explore: event {
join: member {
sql_on: ${event.member_id} = ${member.id} ;;
}
}
-
Luego, deberías crear una dimensión que puedas establecer en yes
o no
, si solo deseas ver los eventos de los miembros, de la siguiente manera:
dimension: is_member_event {
type: yesno
sql: ${member.id} IS NOT NULL ;;
}
-
Se prefiere este enfoque porque brinda a los usuarios la flexibilidad de mirar todos los eventos o solo los eventos de los miembros, según lo deseen. No los obligó a consultar solo los eventos de los miembros a través de la unión.
Si no usas agregados simétricos, evita las uniones que causan fanouts.
Esta sección solo se aplica a los dialectos de la base de datos que no admiten agregaciones simétricas. Consulta la discusión de agregaciones simétricas en la sección Desafíos comunes de esta página para determinar si tu dialecto admite agregaciones simétricas.
Si el dialecto de tu base de datos no admite agregaciones simétricas, debes evitar las uniones que dan como resultado una distribución. En otras palabras, se deben evitar las uniones con una relación de uno a varios entre Explorar y la vista. En su lugar, agregue los datos de la vista en una tabla derivada a fin de establecer una relación uno a uno con Explorar y, luego, una esa tabla derivada a Explorar.
Este concepto importante se explica con más detalle en el artículo El problema de las distribuciones de SQL del Centro de ayuda.