SQLアタマアカデミー
第10回 結合大全 (4)自己結合
自己結合
クロス結合,内部結合,外部結合とは分類の基準が違う
自己結合
たとえば,
図7 自己結合を解説するためのサンプル
Digits
リスト5 自己結合+クロス結合
SELECT D1.digit + (D2.digit * 10) AS seq
FROM Digits D1 CROSS JOIN Digits D2;
さて,
できましたか? 答えは100行。理由は,
SEQ ------ 0 1 2 … 97 98 99
自己結合の考え方
一般的に自己結合を行う場合,
図9 D1とD2はデータが同一の異なる名前のテーブルと考える
以上のような事情から,
COLUMN 結合条件の標準語と方言
結合の条件式の書き方は,
内部結合の場合
具体例を挙げてみましょう。まず内部結合の場合,
リストa 古い構文を利用した内部結合
SELECT E.emp_id, E.emp_name, E.dept_id, D.dept_name
FROM Employees E, Departments D
WHERE E.dept_id = D.dept_id;
これはすべての実装で使うことができる構文ですので,
- ① 結合条件と,
単に1つのテーブルに対してフィルタする条件が同じWHERE句に混在するため, 可読性が低い - ② 可読性が低いのは人間にとってだけでなく,
オプティマイザにとっても同様であり, 効率的な実行計画が選択されない危険がある - ③ いずれこの構文がエラー扱いされるようになる可能性が高い
①と③の理由は主にコードの保守性や開発効率の問題,
まあ,
外部結合の場合
外部結合の構文は,
リストb 古い構文を利用した外部結合
SELECT E.emp_id, E.emp_name, E.dept_id, D.dept_name
FROM Employees E, Departments D
WHERE E.dept_id (+) = D.dept_id;
これは慣れないと相当に読みにくい構文ですし,
“標準語”のススメ
一度覚えた構文を変えるのは生活習慣を変えるみたいなもので,
「細かいところでうるさいこと言うなあ」
- 注a)
事実,
Microsoftは少し昔の技術文書で 「今後使えなくなる可能性があるから方言は使うな」 という警告を発しています。 「SQL Server の今後のバージョンでは, "*=" や "=*" といった外部結合演算子のサポートを続行しない恐れがあるので, ANSI標準の結合句を使用することをお勧めします。」 (「[SQL]ANSI 外部結合で外部結合するテーブルを制限する方法」)
バックナンバー
SQLアタマアカデミー
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (5)集合指向と手続き型
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (4)OLAP関数と集約関数を組み合わせる
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (3)OLAP専用関数
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (2)OLAP関数の基本構文
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (1)OLAP関数とは何か
- 第10回 結合大全 (5)非等値結合
- 第10回 結合大全 (4)自己結合
- 第10回 結合大全 (3)外部結合
- 第10回 結合大全 (2)内部結合
- 第10回 結合大全 (1)クロス結合