トップページに戻る
次の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 織田
データ作成スクリプト
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;
解説