基本に戻ろう: クロス結合
参照元:Back to basics: cross joins < Eddie Awad’s Blog
— beginning of translation —
この記事はOracle結合シリーズの中の一つです。
目次:
1.基本に戻ろう: クロス結合
2.基本に戻ろう: 内部結合
3.基本に戻ろう: 外部結合
4.基本に戻ろう: 等価結合と非等価結合
5.基本に戻ろう: 自己結合
6.基本に戻ろう: アンチジョインとセミジョイン
OracleでSQL文を書く時、私はSQL92準拠の結合構文を使っておらず、それを時代遅れと思っている人もいるかもしれません。
それはさておき、できる限り標準に従って書くよう推奨されています。
Oracle database 9iから、ANSI/ISO SQL92規格に準拠した結合構文を使えるようになりました。もちろん「従来の」 構文を使い続けることもできます。(私はそれを長年使い、慣れ親しんできたわけなのですが)
私にとって「新しい」結合構文を使うことのメリットのひとつに、WHERE句に記述する他の絞込み条件と区別することにより、どれが結合条件なのかを明確できる点です。私は今までの書き方をやめてすべてのクエリ(Oracle 8iを使う時以外は)で「新しい」構文を使おうと思います。それを実践するにあたって、いろいろな結合タイプについて「従来の」構文と、それに対応する「新しい」構文の例を用いて解説していきます。 これは少しも目新しいではありません。ただ「基本に戻る」だけのことなのです。
以下の結合タイプについて今後解説する予定です。:
- クロス結合
- 内部結合
- 外部結合
- 等価結合と非等価結合
- 自己結合
- アンチジョイン
- セミジョイン
まずは別名直積、デカルト積でも知られるクロス結合から始めます。直積は2つの表を結合する際に結合条件を明記しない場合に戻されます。Oracleは1番目の表の各行と2番目の表の各行を結合します。直積の行数は1番目の表の行数と2番目の表の行数を掛けた数になります。
従来の構文を使用した場合:
select e.first_name, d.department_name from employees e, departments d
新しい構文使用した場合:
select e.first_name, d.department_name from employees e cross join departments d
結果セット:
FIRST_NAME DEPARTMENT_NAME -------------------- ------------------------------ Ellen Administration Sundar Administration Mozhe Administration ... ... Matthew Payroll Jennifer Payroll Eleni Payroll2889 rows selected 2889 = 107 employees * 27 departments.
クロス結合が使われることはあまり多くありませんし、極力使わないほうがよいでしょう。
従来の構文を使うと、結合条件の記述を忘れがちになり、結果として意図しない直積を招いてしまいます。
特に直積を必要としないのであれば結合条件を記述する必要があります。結合条件は他のすべての結合タイプにも必要となります。
次回は内部結合について解説します。
— end of translation —
私もSQL92準拠の構文はほとんど使ったことがありません。オラクルマスターのSQLを勉強をした時(もう5年以上も前)以来だと思います。”○○JOINとかいうのがいっぱい出てきてややこしいなぁ、WHERE句でいいじゃん!”と思った覚えがあります。今回このシリーズを読んでみて改めてJOINを使うとそういうメリット(結合条件と絞込条件を明確に分けられる)があるんだということを認識しました。