- Kategorien:
LATERAL¶
In einer FROM-Klausel ermöglicht das LATERAL-Schlüsselwort einer Inline-Ansicht, auf Spalten aus einem Tabellenausdruck zu verweisen, der dieser Inline-Ansicht vorausgeht.
Eine laterale Verknüpfung (Lateral Join) verhält sich eher wie eine korrelierte Unterabfrage als wie die meisten Joins. Ein lateraler Join verhält sich so, als hätte der Server eine Schleife ausgeführt, die der folgenden ähnelt:
for each row in left_hand_table LHT:
execute right_hand_subquery RHS using the values from the current row in the LHT
Im Gegensatz zur Ausgabe eines nicht lateralen Joins enthält die Ausgabe eines lateralen Joins nur die Zeilen, die aus der Inline-Ansicht generiert wurden. Die Zeilen auf der linken Seite müssen nicht mit der rechten Seite verknüpft werden, da die Zeilen auf der linken Seite bereits bei der Übergabe in die Inline-Ansicht berücksichtigt wurden.
Siehe auch Seitliche Verknüpfungen verwenden.
Unter diesem Thema:
Syntax¶
SELECT ...
FROM <left_hand_table_expression>, LATERAL ( <inline_view> )
...
Parameter¶
left_hand_table_expression
Dies ist eine Quelle für Zeilen wie:
Eine Tabelle
Eine Ansicht
Eine Unterabfrage
Eine Tabellenfunktion
Das Ergebnis eines früheren Join
inline_view
Die
inline_view
kann sein:Eine Inline-Ansicht: eine in der Anweisung definierte Ansicht, die nur für die Dauer der Anweisung gültig ist.
Eine Unterabfrage
Eine Tabellenfunktion: entweder eine integrierte Tabellenfunktion wie FLATTEN oder eine benutzerdefinierte Tabellenfunktion (UDTF).
Die
inline_view
kann keine Tabelle sein.
Nutzungshinweise¶
Die Inline-Ansicht nach dem Schlüsselwort LATERAL kann nur auf Spalten in der Inline-Ansicht selbst und in Tabellen links von der Inline-Ansicht in der FROM-Klausel verweisen.
SELECT * FROM table_reference_me, LATERAL (...), table_do_not_reference_me ...
Obwohl die Inline-Ansicht normalerweise auf eine oder mehrere Spalten von
left_hand_table_expression
verweist, ist dies nicht erforderlich.So wie bei der INNER JOIN-Syntax entweder das Komma oder die Schlüsselwörter INNER JOIN verwendet werden können, können bei einem lateralen Join ebenfalls das Komma oder die Schlüsselwörter INNER JOIN verwendet werden. Beispiel:
FROM departments AS d INNER JOIN LATERAL (...)
Sie können die Klauseln ON, USING und NATURAL JOIN nicht in einer lateralen Tabellenfunktion (außer SQL-UDTF) angeben, und Sie können die Klauseln ON, USING und NATURAL JOIN nicht in einem äußeren lateralen Join zu einer Tabellenfunktion (außer SQL-UDTF) angeben.
Weitere Informationen dazu finden Sie in den Nutzungshinweisen zum JOIN-Thema.
Beispiele¶
Siehe auch Beispiel: Verwendung einer Lateral Join mit der Tabellenfunktion FLATTEN und Verwenden von FLATTEN zum Filtern der Ergebnisse in einer WHERE-Klausel.
Das folgende Beispiel verwendet diese Tabellen:
CREATE TABLE departments (department_id INTEGER, name VARCHAR);
CREATE TABLE employees (employee_ID INTEGER, last_name VARCHAR,
department_ID INTEGER, project_names ARRAY);
INSERT INTO departments (department_ID, name) VALUES
(1, 'Engineering'),
(2, 'Support');
INSERT INTO employees (employee_ID, last_name, department_ID) VALUES
(101, 'Richards', 1),
(102, 'Paulson', 1),
(103, 'Johnson', 2);
Diese folgende Abfrage ist ein lateraler Join mit einer Unterabfrage.
SELECT *
FROM departments AS d,
LATERAL (SELECT * FROM employees AS e WHERE e.department_ID = d.department_ID) AS iv2
ORDER BY employee_ID;
+---------------+-------------+-------------+-----------+---------------+---------------+
| DEPARTMENT_ID | NAME | EMPLOYEE_ID | LAST_NAME | DEPARTMENT_ID | PROJECT_NAMES |
|---------------+-------------+-------------+-----------+---------------+---------------|
| 1 | Engineering | 101 | Richards | 1 | NULL |
| 1 | Engineering | 102 | Paulson | 1 | NULL |
| 2 | Support | 103 | Johnson | 2 | NULL |
+---------------+-------------+-------------+-----------+---------------+---------------+
Die folgende SQL-Anweisung ist gleichwertig und erzeugt die gleiche Ausgabe. Sie verwendet die Schlüsselwörter INNER JOIN anstelle des Kommas in der FROM-Klausel.
SELECT *
FROM departments AS d INNER JOIN
LATERAL (SELECT * FROM employees AS e WHERE e.department_ID = d.department_ID) AS iv2
ORDER BY employee_ID;