ORACLEを始めとしたリレーショナルデータベースにおいて、テーブル同士を結合してデータを出力する機会は非常に多いです。
本記事では、結合における分類である等価結合と非等価結合について解説します。
等価結合
等価結合とは
等価結合とは、指定した列について同じデータを持つレコード同士を紐付ける結合です。
結合といえば、この等価結合がほとんどです。
基本的な使い方は以下になります。
-- テーブル1
A B
--- -
001 a
002 b
-- テーブル2
A C
--- -
001 z
003 w
-- 等価結合(ORACLE仕様)
SELECT t1.a
,t1.b
,t2.c
FROM test_table1 t1
,test_table2 t2
WHERE t1.a = t2.a
;
A B C
--- - -
001 a z
-- 等価結合(標準SQL規格(SQL99))
SELECT t1.a
,t1.b
,t2.c
FROM test_table1 t1
JOIN test_table2 t2
ON t1.a = t2.a
;
A B C
--- - -
001 a z
最近のORACLEであれば、ORACLE仕様でも標準SQL規格でもどちらでも問題なく使用できます。
パフォーマンス
等価結合では、ORACLEの内部的な結合処理で、インデックスを利用したネステッドループ結合の選択や、また、大規模テーブルの結合で有効なハッシュ結合が選択可能なため、パフォーマンスが問題となることが、非等価結合と比較して少ないです。
非等価結合
非等価結合とは
非等価結合とは、等価結合以外の結合を指します。つまり、「<>」や「>」等、「=」以外を使用した結合です。
基本的な使い方は以下になります。
-- テーブル1
A
----------
2016/07/15
2016/08/15
-- テーブル2
B C D
---------- ---------- -
2016/07/01 2016/07/31 a
2016/08/01 2016/08/31 b
2016/09/01 2016/09/30 c
-- 非等価結合(ORACLE仕様)
SELECT t1.a
,t2.d
FROM test_table1 t1
,test_table2 t2
WHERE t1.a >= t2.b
AND t1.a <= t2.c
;
A D
---------- -
2016/07/15 A
2016/08/15 B
-- 非等価結合(標準SQL規格(SQL99))
SELECT t1.a
,t2.d
FROM test_table1 t1
JOIN test_table2 t2
ON t1.a >= t2.b
t1.a <= t2.c
;
こちらも、最近のORACLEであれば、ORACLE仕様でも標準SQL規格でもどちらでも問題なく使用できます。
パフォーマンス
非等価結合では、ORACLEの内部的な結合処理でインデックスを利用したネステッドループ結合が使えないことや、ハッシュ結合が選択不可能なため、パフォーマンスが問題となることが、等価結合と比較して多いので注意が必要です。
まとめ
テーブル同士を結合の分類である等価結合と非等価結合について見てきました。
特に非等価結合には注意が必要です。
パフォーマンスという点がひとつ、条件が複雑になりやすく想定外の結果になることがあるという点がもう一つです。
使用する際は、十分なテストを行って論理的な誤り・パフォーマンスの問題が起きないよう注意しましょう。
関連





