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

9-12 一対多の外部結合

SQLパズル

WorkFlowテーブル               Personnelテーブル
job  auth1  auth2  auth3       emp_id  fname
---  -----  -----  -----       ------  -----
  A      a      b      c          a    Joe
  B      a      b      c          b    Mary
  C      b   null      d          c    Ann
  D   null   null   null          d    Bill

WorkFlowテーブルのJobごとのauth1,auth2,auth3
をPersonnelテーブルのemp_idと結合させて、
行に変換して出力する

出力結果
job  authorized_by
---  -------------
  A  Joe
  A  Mary
  A  Ann
  B  Joe
  B  Mary
  B  Ann
  C  Mary
  C  Bill
  D  null


データ作成スクリプト

create table WorkFlow(
job   char(10),
auth1 char(1),
auth2 char(1),
auth3 char(1));

insert into WorkFlow values('A','a' ,'b' ,'c');
insert into WorkFlow values('B','a' ,'b' ,'c');
insert into WorkFlow values('C','b' ,null,'d');
insert into WorkFlow values('D',null,null,null);

create table Personnel(
emp_id char(1),
fname  char(4));

insert into Personnel values('a','Joe');
insert into Personnel values('b','Mary');
insert into Personnel values('c','Ann');
insert into Personnel values('d','Bill');
commit;


SQL

select a.job,b.fname
  from WorkFlow a Left Join Personnel b
    on b.emp_id in(a.auth1,a.auth2,a.auth3)
order by a.job,b.emp_id;


解説

emp_idがauth1,auth2,auth3のいずれかと等しいことを結合条件として、
一対多の外部結合を行ってます