56
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-27

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'
;
56
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?