SQLアタマアカデミー

第10回結合大全 (5)非等値結合

非等値結合

自己結合の用途

ところで、この自己結合というのは、いったいどういう局面で使う結合なのでしょう。これも業務によってはあまり利用しない人も多いかもしれません。

実は、自己結合というのは、SQLにおいてはほぼ用途が決まっています。それは、⁠行間比較」をしたい場合です。行間比較とは、たとえばランキング(順位)算出のように行をまたいで条件を比較するような演算のことです。

自己結合+非等値結合

そして、そうした行間比較を行う場合、自己結合とほとんど常にセットで使われる演算が、非等値結合です。これは文字通り、結合条件に等号以外の<>や<=を使う結合方法で、多くの場合は不等号を使います。

たとえば、図1の部署テーブルに対して「自己結合+非等値結合」を使う例としてリスト6のようなコードが挙げられます。実行結果は図10のようになります。

リスト6 図1の部署テーブルに対して「自己結合+非等値結合」を実行
SELECT D1.dept_id, D2.dept_id
  FROM Departments D1 INNER JOIN Departments D2
    ON D1.dept_id >= D2.dept_id;
図10 リスト6の実行結果

画像

これは、D1およびD2のdept_idを比較して、D1の各dept_idの値に対して、それ以下となるD2のレコードを選択しています。この結果を見ると、D1.dept_idのグループについて含まれるレコード数がきれいに1つずつ増えていることがわかります(これは、部署テーブルの部署IDをたまたま連番で設定したためです⁠⁠。

したがって、リスト7のようにD1.dept_idを集約キーとして集計することで、連番を生成できます図11⁠。

リスト7 自己非等値結合で連番生成
SELECT D1.dept_id, COUNT(*) AS seq
  FROM Departments D1 INNER JOIN Departments D2
    ON D1.dept_id >= D2.dept_id
 GROUP BY D1.dept_id;
図11 リスト7の実行結果
D1.dept_id seq
---------- ---
10         1
11         2
12         3
13         4

こういう自己結合の使い方は、昔からSQLの中級テクニックとして知られているものですが、ほかにも工夫するといろいろな応用が利くので、ぜひ覚えておいてほしいと思います。

演習問題

それでは、今月の演習問題を2つ出しましょう。

  • 問題①:リスト8「自己」クロス結合のコードは何行の結果を返すでしょう。
  • 問題②:その結果は具体的にどのような中身になるでしょう。
リスト8 演習問題用「自己」クロス結合のコード
SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100) AS seq
  FROM Digits D1 CROSS JOIN Digits D2
                    CROSS JOIN Digits D3;

問題①には1秒で答えてください。問題②の制限時間は3分です。回答と解説は、筆者のWebページ内にある「SQL アタマアカデミー」サポートページに掲載しています。

終わりに

結合演算は、DBエンジニアにとって非常に有用で使用頻度も高い道具です。しかし、この演算はそれだけに、割と直観的な理解をされがちで、各種の結合がそれぞれどのような関係にあるのか、という点に注意が払われないことがよくあります。本稿が結合演算の理解の助けとなれば幸いです。

参考資料

ミック『達人に学ぶ SQL徹底指南書』
(翔泳社, 2008)

自己結合および外部結合については、⁠1-2 自己結合の使い方」および「1-5 外部結合の使い方」でさまざまな応用方法を紹介しています。本稿を読んで興味を持たれた方は、参照するとより深い理解が得られるでしょう。

おすすめ記事

記事・ニュース一覧