非等値結合
自己結合の用途
ところで、この自己結合というのは、いったいどういう局面で使う結合なのでしょう。これも業務によってはあまり利用しない人も多いかもしれません。
実は、自己結合というのは、SQLにおいてはほぼ用途が決まっています。それは、「行間比較」をしたい場合です。行間比較とは、たとえばランキング(順位)算出のように行をまたいで条件を比較するような演算のことです。
自己結合+非等値結合
そして、そうした行間比較を行う場合、自己結合とほとんど常にセットで使われる演算が、非等値結合です。これは文字通り、結合条件に等号以外の<>や<=を使う結合方法で、多くの場合は不等号を使います。
たとえば、図1の部署テーブルに対して「自己結合+非等値結合」を使う例としてリスト6のようなコードが挙げられます。実行結果は図10のようになります。
これは、D1およびD2のdept_idを比較して、D1の各dept_idの値に対して、それ以下となるD2のレコードを選択しています。この結果を見ると、D1.dept_idのグループについて含まれるレコード数がきれいに1つずつ増えていることがわかります(これは、部署テーブルの部署IDをたまたま連番で設定したためです)。
したがって、リスト7のようにD1.dept_idを集約キーとして集計することで、連番を生成できます(図11)。
こういう自己結合の使い方は、昔からSQLの中級テクニックとして知られているものですが、ほかにも工夫するといろいろな応用が利くので、ぜひ覚えておいてほしいと思います。
演習問題
それでは、今月の演習問題を2つ出しましょう。
- 問題①:リスト8の「自己」クロス結合のコードは何行の結果を返すでしょう。
- 問題②:その結果は具体的にどのような中身になるでしょう。
問題①には1秒で答えてください。問題②の制限時間は3分です。回答と解説は、筆者のWebページ内にある“「SQL アタマアカデミー」サポートページ”に掲載しています。
終わりに
結合演算は、DBエンジニアにとって非常に有用で使用頻度も高い道具です。しかし、この演算はそれだけに、割と直観的な理解をされがちで、各種の結合がそれぞれどのような関係にあるのか、という点に注意が払われないことがよくあります。本稿が結合演算の理解の助けとなれば幸いです。
参考資料
- ミック『達人に学ぶ SQL徹底指南書』
(翔泳社, 2008)
自己結合および外部結合については、「1-2 自己結合の使い方」および「1-5 外部結合の使い方」でさまざまな応用方法を紹介しています。本稿を読んで興味を持たれた方は、参照するとより深い理解が得られるでしょう。