メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
自己結合は、同じクエリの中で 1 つのテーブルを 2 回読むため、その行どうしを 比較できます。組に関する質問に答える方法です。どの行が同じ値を共有するか、 どの行がどの行より大きいか、といったものです。 始める前に、mysql -u root -p sakila でクライアントを開いてください。

自己結合の仕組み

TABLE_NAME をテーブルに、FIRST_ALIAS と SECOND_ALIAS をそのテーブルの 2 つの異なる名前に、各 COLUMN_NAME を比較する列に置き換えます。 結合に関する他のことは何も変わりません。サーバーは 2 つの側が 1 つのテーブル だとは知らず、他のどんなテーブルの組とも同じように扱います。

エイリアスは省略できない

エイリアスがないと、クエリは 2 つのものを actor と呼ぶことになり、それらを 区別できません。
ERROR 1066 は、サーバーが各側に名前を必要としていると言っているものです。

例

  1. 値を共有する行

Sakila の俳優の中には姓を共有する者がいます。これは、そのそれぞれを他の者と 組にします。
AKROYD という俳優が 3 人いて、その間で 3 組ができます。

  1. 数値で行を比較する

同じ形が「どの映画がどの映画とちょうど同じ長さか」に答えます。これはカタログ内 で最も長い映画に絞り込んでいます。
185 分の映画は 10 本あり、45 は 10 個のものから作れる組の数です。

2 番目の条件がしていること

a1.actor_id < a2.actor_id は、各組を 1 回だけ保持し、俳優が自分自身と組に なるのを防ぐものです。これを取り除くと、同じクエリが別のことに答えます。
108 行ではなく 416 行になり、2 種類の行が紛れ込んでいます。CHRISTIAN AKROYD が自分自身と組になっています。彼自身の行が a1.last_name = a2.last_name を 満たすためです。そして CHRISTIAN と DEBBIE の組が現れ、次に DEBBIE と CHRISTIAN の組が現れます。これは同じ組を逆向きに書いたものです。 id を < で比較すると、両方が一度に解決します。どの id も自分自身より小さく ないため、行が自分自身と一致することを排除し、本物の各組の並びを 1 つだけ 保持します。自己結合で組を探すときは、常に < を使ってください。

まとめ

  • 1 つのテーブルの行どうしを比較するには自己結合を使います。
  • テーブルに 2 つのエイリアスを与えます。エイリアスがないと ERROR 1066 になるためです。
  • 各組を 1 回だけ欲しいときは、2 つのエイリアスの主キーを < で比較します。
  • 排除しない限り、行は自分自身と一致すると考えてください。

関連項目