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

9-20 電話番号簿の作成

SQLパズル

Empテーブル
EmpID  name
-----  -----
   10  Sundy
   20  Heidy
   30  Wendy
   40  Tiger

Phoneテーブル
EmpID  phoneType  phoneNumber
-----  ---------  ------------
   20  home       22-2222-2222
   30  fax        33-3333-3333
   40  home       44-4444-4444
   40  fax        55-5555-5555

以下の形式で、電話番号簿を作成する

出力結果
EmpID  name   homeNumber    faxNumber
-----  -----  ------------  ------------
   10  Sundy  null          null
   20  Heidy  22-2222-2222  null
   30  Wendy  null          33-3333-3333
   40  Tiger  44-4444-4444  55-5555-5555

SQLパズル(日本語版)のパズル13 [電話] を参考にさせていただきました
SQLパズル 第2版のパズル14 [電話とFAX] を参考にさせていただきました


データ作成スクリプト

create table Emp(
EmpID number(2) primary key,
name  varchar2(10));

insert into Emp values(10,'Sundy');
insert into Emp values(20,'Heidy');
insert into Emp values(30,'Wendy');
insert into Emp values(40,'Tiger');

create table Phone(
EmpID       number(2) references Emp(EmpID),
phoneType   varchar2(4) not null check(phoneType in('home','fax')),
phoneNumber char(12),
primary key(EmpID,phoneType));

insert into Phone values(20,'home','22-2222-2222');
insert into Phone values(30,'fax' ,'33-3333-3333');
insert into Phone values(40,'home','44-4444-4444');
insert into Phone values(40,'fax' ,'55-5555-5555');
commit;


SQL

select a.EmpID,a.name,
max(decode(b.phoneType,'home',b.phoneNumber)) as homeNumber,
max(decode(b.phoneType,'fax' ,b.phoneNumber)) as faxNumber
  from Emp a,Phone b
 where a.EmpID = b.EmpID(+)
group by a.EmpID,a.name
order by a.EmpID;


解説

外部結合とグループ化を組み合わせてます