自己結合と別名
別名を使ってテーブルを自身に結合し、同じテーブル内の行(従業員と管理者、日付と前の日付)を比較します。
「自己結合と別名」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
自己結合:テーブルを自身と結合する
リレーションシップが1つのテーブル内に存在することもあります:
- 従業員 ↔ 管理者(管理者も従業員です)
- スレッド形式のコメント(各コメントがparent_idを持ちます)
- 友人関係のグラフ(ユーザー ↔ ユーザー)
準備
自己参照外部キーを持つemployeesテーブル:
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
manager_id BIGINT REFERENCES employees(id)
);従業員とその管理者を結合する
各インスタンスに異なるエイリアスを付けます:
SELECT e.full_name AS employee, m.full_name AS manager
FROM employees e
JOIN employees m ON m.id = e.manager_id;エイリアスがなければコンパイルできない
エイリアスがないと、どちらのfull_nameを指しているのか判別できません。すべての参照があいまいになります:
-- ERROR: column reference "full_name" is ambiguous
SELECT full_name FROM employees JOIN employees ON ...最上位の従業員にはLEFT JOINを使う
INNER JOINでは、管理者がいない従業員(CEOなど)が除外されます。残すにはLEFT JOINを使用します:
SELECT e.full_name AS employee, m.full_name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;スレッド形式のコメント
各コメントを親コメントのテキストとともに表示します:
SELECT c.id, c.body, p.body AS parent_body
FROM comments c
LEFT JOIN comments p ON p.id = c.parent_id;ペアと組み合わせ
同じ注文に含まれていた商品ペアを見つけます((A,B)と(B,A)の重複するペアは除外します):
SELECT a.id AS product_a, b.id AS product_b
FROM order_items a
JOIN order_items b
ON a.order_id = b.order_id
AND a.product_id < b.product_id;隣接する行を比較する
行の「前の」バージョンと自己結合します:
SELECT a.id, a.created_at, b.created_at AS prev_at
FROM events a
LEFT JOIN events b ON b.id = a.previous_id;自己結合とウィンドウ関数
「各行を前の行と比較する」処理の多くでは、自己結合よりもウィンドウ関数(LAG)の方が簡単で高速です。詳しくは「ウィンドウ関数の詳細」で説明します。
再帰的な自己結合
N階層分をたどる必要がある場合(組織図やスレッドツリーなど)は、再帰CTEを使用します。詳しくは「サブクエリとCTE」で説明します。
外部キー列にインデックスを付ける
自己参照する外部キー列には、必ずインデックスを追加してください。インデックスがないと、親を検索するたびにテーブル全体をスキャンすることになります。
CREATE INDEX employees_manager_idx ON employees(manager_id);振り返り
自己結合は、1つのテーブル内の関係を扱います。
- 2つの仮想コピーに対する2つのエイリアス
- ルート/最上位の行を残すための LEFT JOIN
- 外部キー列にインデックスを作成する
- ウィンドウ関数を使うと「前の行」パターンを簡潔にできます
確認問題
employees を自身に結合して各従業員の上司を見つけます。なぜエイリアスが必要ですか?
よくある質問
「自己結合と別名」レッスンは無料ですか?
はい。「自己結合と別名」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「自己結合と別名」で何を学びますか?
別名を使ってテーブルを自身に結合し、同じテーブル内の行(従業員と管理者、日付と前の日付)を比較します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「自己結合と別名」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。