Genau wie in SQL wird in LookML ein Join verwendet, um Zeilen aus zwei oder mehr Tabellen basierend auf einer verknüpften Spalte zusammenzuführen.
In LookML wird ein Explore, das durch den LookML-Parameter explore
definiert wird, verwendet, um festzulegen, wie ein Nutzer die Daten abfragen kann. Ein Explore besteht aus mindestens einer Ansicht oder einer Reihe von Ansichten, die miteinander verknüpft sind. Die Hauptansicht im Explore ist immer in der Abfrage enthalten. Die verknüpften Ansichten werden normalerweise nur einbezogen, wenn sie für die Ausführung der 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 definiert, welche Felder oder Spalten in der Datenbank verfügbar sind und wie auf sie zugegriffen werden soll.
Das folgende Beispiel zeigt eine Definition für die orders
-Schaltfläche „Erkunden“.
explore: orders {
join: users {
type: left_outer
sql_on: ${orders.user_id} = ${users.id} ;;
relationship: many_to_one
}
}
Die Ansicht orders
, die die Hauptansicht im Explore ist, wird mit einem SQL LEFT OUTER JOIN
mit der Ansicht users
verknüpft, 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 auf to ${view_name.field_name}
verwiesen. Wenn sich der Tabellenname oder der Spaltenname in der Datenbank ändert, muss diese Änderung nur an einer Stelle vorgenommen werden.
Der Parameter relationship
ist wichtig. Verknüpfungen können zu Fanout-Problemen führen, bei denen Zeilen dupliziert werden. Wenn Sie angeben, dass viele Bestellungen nur einem Nutzer zugeordnet werden, erkennt Looker, dass bei diesem Join keine Fanouts auftreten. Eine spezielle Verarbeitung ist also nicht erforderlich. one_to_many
-Beziehungen können jedoch einen Fanout auslösen.
Beim automatischen Generieren von Ansichten und Explores wird standardmäßig ein Left Outer Join verwendet. Im vorherigen Beispiel ist es jedoch sehr wahrscheinlich, dass jeder Bestellung genau ein Nutzer zugeordnet ist. Daher kann der Join in diesem Beispiel ein Inner Join sein.
Wenn Sie den generierten SQL-Code 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 den zuvor definierten Explore Orders öffnen und dann die Felder User ID und Count auswählen, sieht der generierte SQL-Code 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 „users“ verwiesen. Sie wird nur bei Bedarf eingebunden.
Wenn Sie die Dimension User ID entfernen und die Dimension ID aus der Ansicht Nutzer hinzufügen, sieht der SQL-Code 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 in der Ansicht Nutzer vorhanden ist, wird der Join berücksichtigt.
Im folgenden Beispiel wird LookML in der zuvor definierten orders
-Explore-Datei gezeigt und ein Join zur Ansicht order_items
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 das Orders-Explore jetzt in der Benutzeroberfläche öffnen, wird die Ansicht Order Items angezeigt. Wenn Sie den Messwert Total Sale Price (Gesamtverkaufspreis) aus der Ansicht Order Items (Bestellpositionen) zusammen mit Count (Anzahl) aus Orders (Bestellungen) und ID aus Users (Nutzer) auswählen, wird in Looker der folgende SQL-Code generiert:
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 aus COUNT(*) AS orders.count
COUNT(DISTINCT orders.id ) AS orders.count
. Looker hat eine mögliche Fanout-Situation erkannt und der Funktion SQL COUNT
automatisch das Keyword SQL DISTINCT
hinzugefügt.