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

10-85 存在有無を調べる

SQLパズル

テーブルA    テーブルB
order_no     order_no  order_type
--------     --------  ----------
aaaa         aaaa         1
bbbb         aaaa         2
cccc         bbbb         1
dddd         cccc         2

テーブルBのorder_typeが1の場合、order_typeAに1
テーブルBのorder_typeが2の場合、order_typeBに1
テーブルAにのみ存在するorder_noは、order_noのみ出力
order_noがaaaaのように、order_typeが2種類とも存在する場合は、1行で出力する

出力結果
order_no  order_typeA   order_typeB
--------  -----------   -----------
aaaa          1               1
bbbb          1            null
cccc          null            1
dddd          null         null

こちらを参考にさせていただきました


データ作成スクリプト

create table テーブルA(order_no char(4));

insert into テーブルA values('aaaa');
insert into テーブルA values('bbbb');
insert into テーブルA values('cccc');
insert into テーブルA values('dddd');

create table テーブルB(
order_no   char(4),
order_type number(1));

insert into テーブルB values('aaaa',1);
insert into テーブルB values('aaaa',2);
insert into テーブルB values('bbbb',1);
insert into テーブルB values('cccc',2);
commit;


SQL

--■■■外部結合を使う方法■■■
select a.order_no,
case when b.order_type is not null then 1 end as order_typeA,
case when c.order_type is not null then 1 end as order_typeB
from テーブルA a,テーブルB b,テーブルB c
where a.order_no = b.order_no(+)
  and a.order_no = c.order_no(+)
  and b.order_type(+) = 1
  and c.order_type(+) = 2
order by a.order_no;

--■■■相関サブクエリを使う方法■■■
select order_no,
(select 1 from テーブルB b
  where b.order_no = a.order_no
    and b.order_type = 1) as order_typeA,
(select 1 from テーブルB b
  where b.order_no = a.order_no
    and b.order_type = 2) as order_typeB
from テーブルA a
order by order_no;

--■■■グループ化する方法■■■
select a.order_no,
max(decode(order_type,1,1)) as order_typeA,
max(decode(order_type,2,1)) as order_typeB
 from テーブルA a,テーブルB b
where a.order_no = b.order_no(+)
group by a.order_no
order by a.order_no;


解説

グループ化する方法では、
max関数がnullを無視することを使ってます