トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

9-65 distinctした結果とpartitioned Anti Join

SQLパズル

Meetingテーブル
ID  Person
--  ------
 1  織田
 1  羽柴
 1  明智
 2  織田
 2  柴田
 3  明智
 3  羽柴
 3  柴田

IDごとに存在しないPersonを下記の形で求める。

出力結果
ID  Person
--  ------
 1  柴田
 2  羽柴
 2  明智
 3  織田

達人に学ぶ SQL徹底指南書の145ページを参考にさせていただきました


データ作成スクリプト

create table Meeting(ID,Person) as
select 1,'織田' from dual union all
select 1,'羽柴' from dual union all
select 1,'明智' from dual union all
select 2,'織田' from dual union all
select 2,'柴田' from dual union all
select 3,'明智' from dual union all
select 3,'羽柴' from dual union all
select 3,'柴田' from dual;


SQL

--■■■distinctした結果とpartitioned Anti Joinする方法(10g以降)■■■
select b.ID,a.Person
from (select distinct Person from Meeting) a
      Left Join Meeting b
      partition by (b.ID)
        on a.Person = b.Person
 where b.Person is null
order by b.ID,a.Person;

--■■■distinctした結果とクロスジョインしてminusで抜く方法■■■
select a.ID,b.Person
from (select distinct ID     from Meeting) a,
     (select distinct Person from Meeting) b
minus
select ID,Person from Meeting;


解説

Model句を使うのもいいでしょうね。

US-OTNのスレッド(類題をmodel句を使って解くサンプルがあります)