Oracleでは「(+)」を用いて外部結合することができるが、
外部側のテーブルに結合条件以外の検索条件がある場合、
その条件にも「(+)」を付与するかしないかで結果が異なることがあるので注意が必要。
サンプルテーブル
テーブルA
col1 | col2 |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
テーブルB
col1 | col2 |
---|---|
1 | a |
1 | b |
2 | c |
3 | d |
SQL
①検索条件にも「(+)」を付与したパターン
SQL①
select
*
from
A,
B
where
A.col1 = B.col1(+)
and B.col2(+) = 'b'
;
②検索条件には「(+)」を付与しないパターン
SQL②
select
*
from
A,
B
where
A.col1 = B.col1(+)
and B.col2 = 'b'
;
結果
①検索条件にも「(+)」を付与したパターン
A.col1 | A.col2 | B.col1 | B.col2 |
---|---|---|---|
1 | A | 1 | b |
2 | B | null | null |
3 | C | null | null |
4 | D | null | null |
↑結合する前に検索条件で絞っている。
②検索条件には「(+)」を付与しないパターン
A.col1 | A.col2 | B.col1 | B.col2 |
---|---|---|---|
1 | A | 1 | b |
↑結合した後に検索条件で絞っている。
ちなみに同じ処理をSQL標準で書くと違いがわかりやすい。
SQL(SQL標準)
①のパターン
SQL①
select
*
from
A
left outer join B
on A.col1 = B.col1
and B.col2 = 'b'
;
②のパターン
SQL②
select
*
from
A
left outer join B
on A.col1 = B.col1
where
B.col2 = 'b'
;