ラテラル結合(LATERAL JOIN)
LATERALを使い、サブクエリ内から直前のFROM項目を参照します — SQLにおける行ごとの関数呼び出しに相当します。
「ラテラル結合(LATERAL JOIN)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
LATERAL とは
LATERAL を使うと、FROM 句のサブクエリから、FROM リスト内で先に記述された項目の列を参照できます。LATERAL がなければ、FROM の各項目は互いを参照できません。
メンタルモデル
LATERAL は「左側の各行について、このクエリを評価する」という意味です。相関サブクエリに似ていますが、FROM 句で使用し、複数の行や列を返せます。
ユーザーごとの上位3件の注文
典型的な LATERAL の使用例です。
SELECT u.id, u.email, o.id AS order_id, o.total
FROM users u
JOIN LATERAL (
SELECT id, total FROM orders
WHERE user_id = u.id
ORDER BY total DESC
LIMIT 3
) AS o ON true;SELECT 内のサブクエリではいけない理由
SELECT 内のスカラーサブクエリは1つの値を返します。LATERAL は、外側の各行に対して複数の行と複数の列を返せます。
関数と LATERAL
集合を返す関数は、デフォルトで LATERAL に近い動作をします。
SELECT t.id, unnest_tag
FROM posts t
CROSS JOIN LATERAL unnest(t.tags) AS unnest_tag;
-- Equivalent (set-returning functions are implicit LATERAL):
SELECT t.id, unnest_tag
FROM posts t, unnest(t.tags) AS unnest_tag;LATERAL とウィンドウ関数の比較
「グループごとの上位 N 件」には、LATERAL と ROW_NUMBER のどちらも使用できます。ROW_NUMBER はテーブルを1回走査するため、多くの場合より効率的です。LATERAL は外側の各行について再度クエリを実行します。
-- ROW_NUMBER alternative:
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
FROM orders
)
SELECT u.email, r.id, r.total
FROM users u
JOIN ranked r ON r.user_id = u.id
WHERE r.rn <= 3;集約関数と LATERAL
行ごとに事前計算した値を取得します。
SELECT u.email, stats.last_order_at, stats.total_orders
FROM users u
LEFT JOIN LATERAL (
SELECT MAX(created_at) AS last_order_at,
COUNT(*) AS total_orders
FROM orders WHERE user_id = u.id
) AS stats ON true;ON true
LATERAL を JOIN で使用するには ON 句が必要です。ただし、結合条件はサブクエリ内にあるため、外側の ON は true になります。
CROSS JOIN LATERAL と LEFT JOIN LATERAL の比較
- CROSS JOIN LATERAL — 内側のクエリが行を返さない場合、外側の行を除外する
- LEFT JOIN LATERAL ... ON true — NULL の列を付けて外側の行を残す
距離検索での LATERAL
各ユーザーについて、最寄りの店舗を取得します。
SELECT u.id, s.name, s.distance
FROM users u
CROSS JOIN LATERAL (
SELECT name, location <-> u.location AS distance
FROM stores
ORDER BY location <-> u.location
LIMIT 1
) AS s;LATERAL は SQL 標準
SQL:1999 で標準化されました。PostgreSQL では LATERAL として実装され、SQL Server では CROSS APPLY / OUTER APPLY が使われます。
パフォーマンス
LATERAL は外側の各行について実行されます。内側のテーブルに適切なインデックスがあれば、各反復を高速に処理できます。インデックスがない場合、データ量が大きいと遅くなる可能性があります。
まとめ
LATERAL = 「外側の行を参照できる FROM サブクエリ」です。
- グループごとの上位 N 件
- 行ごとの事前計算
- 集合を返す関数
- 外部結合には LEFT JOIN ... ON true と組み合わせる
クイックチェック
通常の FROM サブクエリにはできず、LATERAL ならできることは何ですか?
よくある質問
「ラテラル結合(LATERAL JOIN)」レッスンは無料ですか?
はい。「ラテラル結合(LATERAL JOIN)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「ラテラル結合(LATERAL JOIN)」で何を学びますか?
LATERALを使い、サブクエリ内から直前のFROM項目を参照します — SQLにおける行ごとの関数呼び出しに相当します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ラテラル結合(LATERAL JOIN)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CROSS JOINと直積
- ラテラル結合(LATERAL JOIN)
- アンチ結合とセミ結合(NOT EXISTS)
- 複数テーブル結合の性能チューニング