トップページに戻る
次の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;
解説
外部結合とグループ化を組み合わせてます