SQLアタマアカデミー

第10回結合大全 (4)自己結合

自己結合

クロス結合、内部結合、外部結合とは分類の基準が違う

自己結合self joinは、文字通り自分自身と結合する演算で、要するに同じテーブル(あるいは同じビュー)を使って結合を行うものです。これは、先に解説してきた3種類の結合とはちょっと毛色が違います。というのも、自己結合というのは演算の種類に基づいた分類ではなく、演算の対象に何を使うかという点だけが問題だからです。その証拠に、自己結合は、⁠自己結合+クロス結合」⁠自己結合+外部結合」というように、ほかの結合と組み合わせて使うことができます。

たとえば、ちょっとパズル的な問題をサンプルに使って考えてみましょう。図7のような1行に1つ数字を持つ10行の「数字」テーブルを作ります。このテーブルに対して「自己結合+クロス結合」を行います。コードはリスト5のものを使います。

図7 自己結合を解説するためのサンプル

Digits

digit(数字)
0
1
2
3
4
5
6
7
8
9
リスト5 自己結合+クロス結合
SELECT D1.digit + (D2.digit * 10) AS seq
  FROM Digits D1 CROSS JOIN Digits D2;

さて、このコードの結果が具体的にどうなるか、ということを考える前に、行数が何行になるかを考えてください。これだけは、本稿をここまで読んだみなさんなら1秒で即答できるはずです。

できましたか? 答えは100行。理由は、クロス結合において行数の計算は、結合対象となるテーブルの行数の掛け算になるからです。この場合、結合対象はDigits(D1)およびDigits(D2)ですので、どちらも10行。したがって10×10が答えになります。ちなみにこのクエリの結果は、0から99までの連番になります図8⁠。

図8 リスト5の実行結果
SEQ
------
0
1
2
…
97
98
99

自己結合の考え方

一般的に自己結合を行う場合、同じテーブルに別名(この場合はD1とD2)をつけて、それらをあたかも別のテーブルであるかのように扱います。というより、クエリの動作を把握するためだけであれば、本当にこれらは別のテーブルであると考えるほうがスムーズです。つまり、D1とD2を、偶然保持するデータがまったく同一だった2つの異なる名前のテーブルとみなすのです図9⁠。そうすると、上のクエリは単純に、D1およびD2を対象としたクロス結合とみなすことができるわけです。

図9 D1とD2はデータが同一の異なる名前のテーブルと考える

画像

以上のような事情から、筆者は個人的に、結合の種類として自己結合という特別の分類は不要だと考えています。同一のテーブルと結合しているということは、物理レベルで見ればそのとおりなのですが、論理レベルで見ればそうした観点は不要になるからです。

おすすめ記事

記事・ニュース一覧