トップページに戻る    次の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もどき