SQL-Konzepte für Joins

Wie in SQL wird auch in LookML ein Join verwendet, um Zeilen aus zwei oder mehr Tabellen basierend auf einer zugehörigen Spalte zusammenzuführen.

In LookML wird ein Explore – wie durch den explore LookML-Parameter definiert – 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 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 ist eine Definition für das Explore orders.

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 der Ansicht users mit einem SQL LEFT OUTER JOIN verknüpft, wie durch den LookML-Parameter type: left_outer angegeben. Die SQL ON Anweisung, die durch den sql_on LookML Parameter definiert wird, verwendet nicht table_alias.column, sondern verweist to ${view_name.field_name}. So muss eine Änderung des Tabellennamens oder des Spaltennamens in der Datenbank nur an einer Stelle vorgenommen werden.

Der relationship Parameter ist wichtig. Joins können zu Fanout-Problemen führen, bei denen Zeilen dupliziert werden. Wenn Sie angeben, dass viele Bestellungen nur mit einem Nutzer verknüpft werden, erkennt Looker, dass bei diesem Join keine Fanouts auftreten. Eine spezielle Verarbeitung ist daher nicht erforderlich. one_to_many-Beziehungen können jedoch ein Fanout auslösen.

Bei der automatischen Generierung von Ansichten und Explores wird standardmäßig ein Left Outer Join verwendet. Im vorherigen Beispiel ist es jedoch sehr wahrscheinlich, dass jede Bestellung genau einen Nutzer hat. Der Join in diesem Beispiel kann also ein Inner Join sein.

Wenn Sie den generierten SQL-Code eines Explore 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 das zuvor definierte 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 einbezogen, wenn sie benötigt wird.

Wenn Sie die Dimension User ID entfernen und die Dimension ID aus der Ansicht Users 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 aus der Ansicht Users erfolgt, ist der Join enthalten.

Das folgende Beispiel zeigt LookML in der zuvor definierten Explore-Datei orders und fügt einen Join zur Ansicht order_items hinzu:

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 das Explore Orders in der Benutzeroberfläche öffnen, sehen Sie die Ansicht Order Items. Wenn Sie die Measure Total Sale Price aus der Ansicht Order Items zusammen mit Count aus Orders und ID aus Users auswählen, generiert Looker den folgenden SQL-Code:

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 zu COUNT(DISTINCT orders.id ) AS orders.count. Looker hat erkannt, dass es zu einem Fanout kommen könnte, und automatisch das Schlüsselwort SQL DISTINCT zur Funktion SQL COUNT hinzugefügt.