0Pricing
SQL Academy · レッスン

ラテラル結合(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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CROSS JOINと直積
  2. ラテラル結合(LATERAL JOIN)
  3. アンチ結合とセミ結合(NOT EXISTS)
  4. 複数テーブル結合の性能チューニング
← SQL Academyに戻る