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

10-34 nvl関数とスカラー問い合わせ

SQLパズル

ATbl
KEY  CHUMON
---  ------
  1    0501
  2    0123
  3    4567

BTbl
KEY  ITEM  GK
---  ----  --
  1   100  50
  1   200  80
  1   300  90
  2   100  10
  2   400  90
  3   200  20

リレーションが1対1もしくは、1対2である2テーブルから
ITEMが100もしくは200のGKを出力する(どちらかしかない場合もある)

出力結果
KEY  CHUMON  ITEM100  ITEM200
---  ------  -------  -------
  1    0501       50       80   100,200両方ある場合
  2    0123       10        0   100しかない場合
  3    4567        0       20   200しかない場合

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


データ作成スクリプト

create table ATbl(
KEY    number(1),
CHUMON char(4));

insert into ATbl values(1,'0501');
insert into ATbl values(2,'0123');
insert into ATbl values(3,'4567');

create table BTbl(
KEY  number(1),
ITEM number(3),
GK   number(2));

insert into BTbl values(1,100,50);
insert into BTbl values(1,200,80);
insert into BTbl values(1,300,90);
insert into BTbl values(2,100,10);
insert into BTbl values(2,400,90);
insert into BTbl values(3,200,20);
commit;


SQL

--■■■スカラーサブクエリを使う方法■■■
select KEY,CHUMON,
nvl((select b.GK from BTbl b
      where b.KEY=a.KEY
        and b.ITEM=100),0) as ITEM100,
nvl((select b.GK from BTbl b
      where b.KEY=a.KEY
        and b.ITEM=200),0) as ITEM200
from ATbl a;

--■■■外部結合してからグループ化する方法■■■
select a.Key,a.CHUMON,
nvl(max(decode(b.ITEM,100,b.GK)),0) as ITEM100,
nvl(max(decode(b.ITEM,200,b.GK)),0) as ITEM200
  from ATbl a Left Join BTbl b
    on (a.KEY = b.KEY
    and b.ITEM in(100,200))
group by a.Key,a.CHUMON
order by a.Key,a.CHUMON;


解説

スカラー問い合わせは、行を返さない場合にnullとなるので、
nvl関数で、nullを0に変換してます。