Genau wie in SQL werden mit einem Join in LookML Zeilen aus zwei oder mehr Tabellen basierend auf einer gemeinsamen Spalte zusammengeführt.
In LookML wird ein Explore – wie vom LookML-Parameter explore
definiert – verwendet, um festzulegen, wie ein Nutzer die Daten abfragen kann. Ein Explore besteht aus mindestens einer Ansicht oder mehreren Ansichten, die miteinander verknüpft sind. Die Hauptansicht im Explore ist immer in der Abfrage enthalten. Die zusammengeführten Datenansichten werden normalerweise nur eingeschlossen, wenn sie für die Abfrage erforderlich sind.
Eine LookML-Ansicht entspricht einer SQL-Tabelle (oder einem anderen Element mit der Struktur einer Tabelle) in der Datenbank oder einer abgeleiteten Tabelle. In der Ansicht wird festgelegt, welche Felder oder Spalten in der Datenbank verfügbar sind und wie darauf zugegriffen werden soll.
Das folgende Beispiel ist eine Definition für die orders
-Erkundung.
explore: orders {
join: users {
type: left_outer
sql_on: ${orders.user_id} = ${users.id} ;;
relationship: many_to_one
}
}
Die Ansicht orders
, die Hauptansicht im Explore, wird mit einer SQL LEFT OUTER JOIN
mit der Ansicht users
verbunden, wie durch den LookML-Parameter type: left_outer
angegeben. In der SQL ON
-Klausel, die durch den sql_on
-LookML-Parameter definiert wird, wird nicht table_alias.column
verwendet, sondern stattdessen to ${view_name.field_name}
. So muss die Änderung nur an einer Stelle vorgenommen werden, wenn sich der Tabellen- oder Spaltenname in der Datenbank ändert.
Der Parameter relationship
ist wichtig. Joins können zu Fan-out-Problemen führen, bei denen Zeilen dupliziert werden. Wenn Sie angeben, dass viele Bestellungen nur mit einem Nutzer zusammengeführt werden, erkennt Looker, dass durch diesen Join keine Verzweigungen auftreten. Eine spezielle Verarbeitung ist daher nicht erforderlich. one_to_many
-Beziehungen können jedoch eine Verzweigung auslösen.
Bei der automatischen Erstellung von Ansichten und Explores wird standardmäßig ein Left Outer Join verwendet. Im vorherigen Beispiel ist es jedoch sehr wahrscheinlich, dass jeder Auftrag genau einen Nutzer hat. Daher kann der Join in diesem Beispiel ein innerer Join sein.
Wenn Sie sich das generierte SQL-Statement eines Explores ansehen möchten, können Sie das Explore in der Benutzeroberfläche ausführen und dann im Bereich Daten den Tab SQL auswählen.
Wenn Sie beispielsweise die zuvor definierte explorative Datenanalyse Aufträge öffnen und dann die Felder Nutzer-ID und Anzahl auswählen, sieht die generierte SQL-Anweisung so aus:
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
In diesem Beispiel wird nicht auf die Tabelle „Nutzer“ verwiesen. Sie wird nur bei Bedarf hereingeholt.
Wenn Sie die Dimension User ID entfernen und die Dimension ID aus der Ansicht Nutzer hinzufügen, sieht die SQL-Abfrage so aus:
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
Da in diesem Fall eine Auswahl aus der Ansicht Nutzer getroffen wurde, ist die Zusammenführung enthalten.
Im folgenden Beispiel wird LookML in der zuvor definierten orders
-Explore-Datei angezeigt und der order_items
-Ansicht wird eine Verbindung hinzugefügt:
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
}
}
Wenn Sie jetzt die explorative Datenanalyse Bestellungen in der Benutzeroberfläche öffnen, wird die Ansicht Bestellelemente angezeigt. Wenn Sie den Messwert Gesamtverkaufspreis aus der Ansicht Bestellpositionen sowie Anzahl aus Bestellungen und ID aus Nutzer auswählen, generiert Looker die folgende SQL-Abfrage:
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
In diesem Beispiel wurde COUNT(*) AS orders.count
in COUNT(DISTINCT orders.id ) AS orders.count
umgewandelt. Looker hat erkannt, dass eine mögliche Verzweigung vorliegt, und der Funktion SQL COUNT
automatisch das Keyword SQL DISTINCT
hinzugefügt.