Assim como no SQL, uma junção em LookML é usada para combinar linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas.
No LookML, uma Análise, conforme definido pelo parâmetro explore
do LookML, é usada para definir como um usuário pode consultar os dados. Uma análise detalhada consiste em pelo menos uma visualização ou um conjunto de visualizações unidas. A visualização principal na Análise sempre é incluída na consulta. As visualizações unidas normalmente só são incluídas se forem necessárias para atender à consulta.
Uma visualização do LookML corresponde a uma tabela SQL (ou outro elemento que tenha a estrutura de uma tabela) no banco de dados ou a uma tabela derivada. A visualização define quais campos ou colunas estão disponíveis no banco de dados e como eles devem ser acessados.
O exemplo a seguir é uma definição para a análise detalhada orders
.
explore: orders {
join: users {
type: left_outer
sql_on: ${orders.user_id} = ${users.id} ;;
relationship: many_to_one
}
}
A visualização orders
, que é a principal na Análise, está sendo unida à visualização users
com um SQL LEFT OUTER JOIN
, conforme indicado pelo parâmetro type: left_outer
do LookML. A cláusula SQL ON
, definida pelo parâmetro sql_on
do LookML, não usa table_alias.column
, mas se refere a to ${view_name.field_name}
. Assim, se o nome da tabela ou da coluna mudar no banco de dados, a alteração só precisará ser feita em um lugar.
O parâmetro relationship
é importante. As junções podem causar problemas de fanout, em que as linhas são duplicadas. Ao especificar que muitos pedidos vão se juntar a apenas um usuário, o Looker reconhece que não haverá fanouts dessa junção, portanto, não é necessário um tratamento especial. No entanto, as relações one_to_many
podem acionar um fanout.
A geração automática de visualizações e análises detalhadas usa uma junção externa à esquerda por padrão. No exemplo anterior, no entanto, é muito provável que cada pedido tenha exatamente um usuário. Portanto, a junção nesse exemplo pode ser interna.
Para ver o SQL gerado de uma análise detalhada, execute a análise na interface e selecione a guia SQL no painel Dados.
Por exemplo, se você abrir a análise detalhada Pedidos, que foi definida anteriormente, e selecionar os campos ID do usuário e Contagem, o SQL gerado será semelhante a este:
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
Neste exemplo, a tabela de usuários não é referenciada. Ele só é usado se for necessário.
Se você remover a dimensão User ID e adicionar a dimensão ID da visualização Usuários, o SQL vai ficar assim:
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
Nesse caso, como há uma seleção na visualização Usuários, a junção é incluída.
O exemplo a seguir mostra o LookML no arquivo de análise orders
, que foi definido anteriormente, e adiciona uma junção à visualização 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
}
}
Agora, se você abrir a análise Pedidos na UI, vai encontrar a visualização Itens do pedido. Se você selecionar a medida Preço total de venda na visualização Itens do pedido junto com a Contagem de Pedidos e o ID de Usuários, o Looker vai gerar o seguinte 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
Neste exemplo, COUNT(*) AS orders.count
se tornou COUNT(DISTINCT orders.id ) AS orders.count
. O Looker detectou uma possível situação de fanout e adicionou automaticamente a palavra-chave SQL DISTINCT
à função SQL COUNT
.