トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-241 Partitioned Anti Joinもどき
SQLパズル
IDTable SeqTable
ID SeqID SeqID SeqName
--- ----- ----- -------
101 1 1 One
101 4 2 Two
102 2 3 Three
102 3 4 Four
103 1
IDTableのIDごとに、
SeqIDを結合キーとして、SeqTableとアンチ結合する。
出力結果
ID SeqName
--- -------
101 Two
101 Three
102 One
102 Four
103 Two
103 Three
103 Four
データ作成スクリプト
create table IDTable(ID,SeqID) as
select 101,1 from dual union all
select 101,4 from dual union all
select 102,2 from dual union all
select 102,3 from dual union all
select 103,1 from dual;
create table SeqTable(SeqID,SeqName) as
select 1,'One' from dual union all
select 2,'Two' from dual union all
select 3,'Three' from dual union all
select 4,'Four' from dual;
SQL
--■■■Partitioned Outer Joinを使う方法(10g以降)■■■
select b.ID,a.SeqName
from SeqTable a
Left outer join IDTable b
partition by (b.ID)
on (a.SeqID = b.SeqID)
where b.SeqID is null
order by b.ID,a.SeqID;
--■■■not existsを使う方法■■■
select a.ID,b.SeqName
from (select distinct ID from IDTable) a,SeqTable b
where not exists(select 1 from IDTable c
where c.ID = a.ID
and c.SeqID = b.SeqID)
order by a.ID,b.SeqID;
解説
Partitioned Outer Joinを使う方法では、
実質、外部結合してからwhere句でフィルタをかけてるのですが
Partitioned Outer Joinによく似た
Partitioned Anti Joinと考えていいでしょう。
日本語の用語だと、
パーティション化された外部結合によく似た
パーティション化されたアンチ結合と考えていいでしょう。
3-34 Partitioned Outer Join
8-29 Partitioned Inner Joinもどき