VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
mysql -u root -p sakila でクライアントを開いてください。
自己結合の仕組み
TABLE_NAME をテーブルに、FIRST_ALIAS と SECOND_ALIAS をそのテーブルの
2 つの異なる名前に、各 COLUMN_NAME を比較する列に置き換えます。
結合に関する他のことは何も変わりません。サーバーは 2 つの側が 1 つのテーブル
だとは知らず、他のどんなテーブルの組とも同じように扱います。
エイリアスは省略できない
エイリアスがないと、クエリは 2 つのものをactor と呼ぶことになり、それらを
区別できません。
ERROR 1066 は、サーバーが各側に名前を必要としていると言っているものです。
例
- 値を共有する行
Sakila の俳優の中には姓を共有する者がいます。これは、そのそれぞれを他の者と
組にします。
- 数値で行を比較する
同じ形が「どの映画がどの映画とちょうど同じ長さか」に答えます。これはカタログ内
で最も長い映画に絞り込んでいます。
2 番目の条件がしていること
a1.actor_id < a2.actor_id は、各組を 1 回だけ保持し、俳優が自分自身と組に
なるのを防ぐものです。これを取り除くと、同じクエリが別のことに答えます。
CHRISTIAN AKROYD
が自分自身と組になっています。彼自身の行が a1.last_name = a2.last_name を
満たすためです。そして CHRISTIAN と DEBBIE の組が現れ、次に DEBBIE と
CHRISTIAN の組が現れます。これは同じ組を逆向きに書いたものです。
id を < で比較すると、両方が一度に解決します。どの id も自分自身より小さく
ないため、行が自分自身と一致することを排除し、本物の各組の並びを 1 つだけ
保持します。自己結合で組を探すときは、常に < を使ってください。
まとめ
- 1 つのテーブルの行どうしを比較するには自己結合を使います。
- テーブルに 2 つのエイリアスを与えます。エイリアスがないと
ERROR 1066になるためです。 - 各組を 1 回だけ欲しいときは、2 つのエイリアスの主キーを
<で比較します。 - 排除しない限り、行は自分自身と一致すると考えてください。
関連項目
- テーブルエイリアス — このクエリが依存する命名
- INNER JOIN — 自己結合がその特殊な場合である結合
- 結合の仕組み — 他の種類の中でのこの結合の位置
- MySQL の JOIN のパフォーマンスとよくある間違い — 大きなテーブルで自己結合にかかるコスト