納品テーブル
商品番号 商社番号 納品数量
-------- -------- --------
1111 aaaa 10
1111 bbbb 20
2222 aaaa 30
2222 bbbb 40
2222 cccc 50
3333 bbbb 60
3333 cccc 70
商品テーブル
商品番号 商品名
-------- ------------
1111 USBメモリ
2222 LANケーブル
3333 マウスパッド
商社テーブル
商社番号 商社名
-------- ------
aaaa 商社A
bbbb 商社B
cccc 商社C
すべての商品を納品する商社の、
商社名を出力する。
出力結果
商社名
------
商社B
create table 納品(
商品番号 char(4),
商社番号 char(4),
納品数量 number(2));
insert into 納品 values('1111','aaaa',10);
insert into 納品 values('1111','bbbb',20);
insert into 納品 values('2222','aaaa',30);
insert into 納品 values('2222','bbbb',40);
insert into 納品 values('2222','cccc',50);
insert into 納品 values('3333','bbbb',60);
insert into 納品 values('3333','cccc',70);
create table 商品(
商品番号 char(4),
商品名 varchar2(12));
insert into 商品 values('1111','USBメモリ');
insert into 商品 values('2222','LANケーブル');
insert into 商品 values('3333','マウスパッド');
create table 商社(
商社番号 char(4),
商社名 varchar2(5));
insert into 商社 values('aaaa','商社A');
insert into 商社 values('bbbb','商社B');
insert into 商社 values('cccc','商社C');
commit;
--■■■not existsを2回使う方法■■■
select 商社名
from 商社 a
where not exists(select 1 from 商品 b
where not exists(select 1 from 納品 c
where c.商社番号 = a.商社番号
and c.商品番号 = b.商品番号));
--■■■minusを使う方法■■■
select 商社名
from 商社 a
where not exists(select b.商品番号 from 商品 b
minus
select c.商品番号 from 納品 c
where c.商社番号 = a.商社番号);
--■■■Partitioned Outer Joinを使う方法(10g以降)■■■
select c.商社名
from 商品 a Left Join 納品 b
partition by (b.商社番号)
on (a.商品番号 = b.商品番号)
Join 商社 c
on (b.商社番号 = c.商社番号)
group by b.商社番号,c.商社名
having count(*) = count(b.商品番号);
minusを使うと、 集合の商演算をシンプルにできます。