Edited at

Oracle独自の書き方で外部結合する際の注意点

More than 3 years have passed since last update.

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'
;