- カテゴリ:
LATERAL¶
FROM 句では、 LATERAL キーワードを使用すると、インラインビューでそのインラインビューの前にあるテーブル式から列を参照できます。
ラテラル結合は、ほとんどの結合よりも相関サブクエリのように動作します。ラテラル結合は、サーバーが次のようなループを実行したかのように動作します。
for each row in left_hand_table LHT:
execute right_hand_subquery RHS using the values from the current row in the LHT
非ラテラル結合の出力とは異なり、ラテラル結合の出力には、インラインビューから生成された行のみが含まれます。左側の行は、インラインビューに渡されることで既に考慮されているため、左側の行を右側に結合する必要はありません。
側方結合の使用 もご参照ください。
このトピックの内容:
構文¶
SELECT ...
FROM <left_hand_table_expression>, LATERAL ( <inline_view> )
...
パラメーター¶
left_hand_table_expression
これは、次のような行のソースです。
テーブル。
ビュー。
サブクエリ。
テーブル関数。
以前の結合の結果。
inline_view
inline_view
は次のいずれかです。インラインビュー: ステートメント内で定義され、ステートメントの期間のみ有効なビュー。
サブクエリ。
テーブル関数: FLATTEN などの組み込みテーブル関数またはユーザー定義のテーブル関数(UDTF)のいずれか。
inline_view
はテーブルにできません。
使用上の注意¶
キーワード LATERAL の後のインラインビューは、インラインビュー自体および FROM 句のインラインビューの左側のテーブルからのみ列を参照できます。
SELECT * FROM table_reference_me, LATERAL (...), table_do_not_reference_me ...
通常、インラインビューは
left_hand_table_expression
の列を参照しますが、必ずしもそうする必要はありません。INNER JOIN 構文がコンマまたはキーワード「INNER JOIN」を使用できるように、ラテラル結合でもコンマまたはキーワード INNER JOIN を使用できます。例:
FROM departments AS d INNER JOIN LATERAL (...)
ラテラルテーブル関数(SQL UDTF 以外)では、 ON、 USING、 NATURAL JOIN 句は指定できません。また、テーブル関数(SQL UDTF 以外)への外側ラテラル結合では、 ON、 USING、 NATURAL JOIN 句は指定できません。
詳細については、 JOIN トピックにある使用上の注意 をご参照ください。
例¶
(例: FLATTEN テーブル関数でのラテラル結合の使用 および WHERE 句での FLATTEN を使用した結果のフィルター処理 もご参照ください)
次の例では、これらのテーブルを使用します。
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);
以下のクエリは、サブクエリを含むラテラル結合です。
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 |
+---------------+-------------+-------------+-----------+---------------+---------------+
次の SQL ステートメントは同等で、同じ出力を生成します。FROM 句のコンマの代わりに INNER JOIN というキーワードが使われています。
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;