トップページに戻る
次の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を無視することを使ってます