0Pricing
SQL Academy · レッスン

自己結合と別名

別名を使ってテーブルを自身に結合し、同じテーブル内の行(従業員と管理者、日付と前の日付)を比較します。

「自己結合と別名」は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フィードバックを取得できます。ローカル設定は不要です。

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

  1. なぜJOINが必要か(リレーショナルモデルの復習)
  2. INNER JOINの仕組み
  3. LEFT/RIGHT JOINとOUTER JOIN
  4. 自己結合と別名
← SQL Academyに戻る