カテゴリ:

クエリ構文

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
Copy

非ラテラル結合の出力とは異なり、ラテラル結合の出力には、インラインビューから生成された行のみが含まれます。左側の行は、インラインビューに渡されることで既に考慮されているため、左側の行を右側に結合する必要はありません。

側方結合の使用 もご参照ください。

このトピックの内容:

構文

SELECT ...
FROM <left_hand_table_expression>, LATERAL ( <inline_view> )
...
Copy

パラメーター

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 ...
    
    Copy
  • 通常、インラインビューは left_hand_table_expression の列を参照しますが、必ずしもそうする必要はありません。

  • INNER JOIN 構文がコンマまたはキーワード「INNER JOIN」を使用できるように、ラテラル結合でもコンマまたはキーワード INNER JOIN を使用できます。例:

    FROM departments AS d INNER JOIN LATERAL (...)
    
    Copy
  • ラテラルテーブル関数(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);
Copy

以下のクエリは、サブクエリを含むラテラル結合です。

SELECT *
  FROM departments AS d,
    LATERAL (SELECT * FROM employees AS e WHERE e.department_ID = d.department_ID) AS iv2
  ORDER BY employee_ID;
Copy
+---------------+-------------+-------------+-----------+---------------+---------------+
| 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;
Copy