- カテゴリ:
LATERAL¶
FROM 句では、 LATERAL キーワードを使用すると、インラインビューでそのインラインビューの前にあるテーブル式から列を参照できます。
ラテラル結合は、一般的な結合よりも相関サブクエリのように動作します。ラテラル結合は、サーバーが次のようなループを実行したかのように動作します。
非ラテラル結合の出力とは異なり、ラテラル結合の出力にはインラインビューから生成された行のみが含まれます。左側から右側に行を結合する場合、明示的なON句は必要ありません。インラインビューが左側のテーブル式の列を参照するため、関係は既に確立されています。
側方結合の使用 もご参照ください。
LATERAL を使用するタイミング¶
LATERALは、以下のようなユースケースに役立つツールです。
ネストされたデータのテーブル関数のチェーン :配列内の配列をフラット化する必要がある場合や、ネストされたJSONの複数のレベルをナビゲートする必要がある場合、後続の各テーブル関数呼び出しは、前の呼び出しの出力を参照する必要があります。ラテラル結合はこれを可能にします。
行固有の引数を使用してテーブル関数を呼び出す :テーブル関数(UDTFなど)は、左側のテーブルから行ごとに異なる入力値を受け取る必要があります。
単一レベルの配列をフラット化するなどの単純なケースでは、ラテラル結合なしで TABLE(FLATTEN(...)) を使用すると同じ結果が生成されます。ラテラル結合は、インラインビューがFROM句の前の式からのみ取得できる列を参照する必要がある場合にのみ必要です。
構文¶
パラメーター¶
left_hand_table_expressionこれは、次のような行のソースです。
テーブル。
ビュー。
サブクエリ。
テーブル関数。
以前の結合の結果。
inline_viewinline_viewは次のいずれかです。インラインビュー: ステートメント内で定義され、ステートメントの期間のみ有効なビュー。
サブクエリ。
テーブル関数: FLATTEN などの組み込みテーブル関数またはユーザー定義のテーブル関数(UDTF)のいずれか。
inline_viewはプレーンテーブル参照にはできません。WHERE句またはテーブル関数呼び出しを使用するサブクエリなど、左側のテーブル式の値に基づいて行を処理またはフィルターできる式でなければなりません。
使用上の注意¶
キーワード LATERAL の後のインラインビューは、インラインビュー自体および FROM 句のインラインビューの左側のテーブルからのみ列を参照できます。
通常、インラインビューは
left_hand_table_expressionの1つ以上の列を参照しますが、その必要はありません。INNER JOIN 構文がコンマまたはキーワード「INNER JOIN」を使用できるように、ラテラル結合でもコンマまたはキーワード INNER JOIN を使用できます。例:
ON、USING、またはNATURAL JOIN句は、以下で指定できません。
ラテラルテーブル関数(SQL UDTF以外)
テーブル関数への外部ラテラル結合(SQL UDTF以外)
詳細については、JOINトピックの使用上の注意 をご参照ください。
left_hand_table_expression`はUNPIVOTの結果セットにすることはできません。LATERAL結合でUNPIVOTエイリアスを参照しようとすると、エラーが発生します。回避策として、まずUNPIVOTの結果を仮テーブルに実体化し、その後、そのテーブルを左辺の式として使用します。詳細については、 :doc:/sql-reference/constructs/unpivot` をご参照ください。
例¶
(例: FLATTEN テーブル関数でのラテラル結合の使用 および WHERE 句での FLATTEN を使用した結果のフィルター処理 もご参照ください)
次の例では、これらのテーブルを使用します。
次のクエリは、サブクエリを持つラテラル結合です。
次の SQL ステートメントは同等で、同じ出力を生成します。FROM 句のコンマの代わりに INNER JOIN というキーワードが使われています。
ネストされたデータ用にLATERAL FLATTENをチェーンする¶
LATERALは、複数の FLATTEN 呼び出しをチェーンして、ネスト化されたデータ構造にアクセスする必要がある場合に必要です。次の例では、2番目のFLATTENは、最初のFLATTENの出力を参照する必要があります。これはLATERALでしかできません。
次のクエリは2つのLATERAL FLATTEN呼び出しを使用します。最初の呼び出しは contact 配列をフラット化し、2番目は各連絡先内で business 配列をフラット化します。2番目のFLATTEN呼び出しは、 f.value を参照します。これは、最初のFLATTEN呼び出しの出力から得られます。
このクエリは、LATERALなしでは記述できません。なぜなら、2番目のFLATTEN呼び出しは、最初のFLATTEN呼び出しの出力に依存するからです。
LATERALと他のアプローチとの比較¶
次のテーブルは、他のアプローチと比較してLATERALを使用するタイミングをまとめたものです。
ユースケース |
推奨 |
|---|---|
単一レベルの配列をフラット化する |
LATERALなしの |
ネストされた配列をフラット化する(配列内の配列) |
チェーンFLATTEN呼び出しにはLATERALが必要です。 |
現在の行に基づいて別のテーブルから行をフィルターする |
SELECTリストの相関サブクエリまたはLATERALで動作します。LATERALは複数の行と列を返すことができます。SELECTの相関サブクエリはこれを実行できません。 |
行固有の入力でテーブル関数を呼び出す |
LATERALは、テーブル関数が行ごとに異なる引数を受け取ることを許可します。 |