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

4-3 select句で1対1の結合

SQLパズル

tbl1
tbl1_ID   name1  tbl2_ID
-------   -----  -------
      1   山田         1
      2   佐藤         2
      3   鈴木         3
      4   池田      null

tbl2
tbl2_ID   tel
-------   ------------
      1   052-111-xxxx
      2   052-222-xxxx
      3   052-333-xxxx

tbl3
tbl3_ID  tbl2_ID   mail
-------  -------   ---------------
      1        1   yamada@test.com
      2        2   sato@test.com

3テーブルを結合して、下記の出力を行う。

出力結果
name1  tel            mail
-----  ------------   ---------------
山田   052-111-xxxx   yamada@test.com
佐藤   052-222-xxxx   sato@test.com
鈴木   052-333-xxxx   null
池田   null           null
こちらを参考にさせていただきました


データ作成スクリプト

create table tbl1(
tbl1_ID number(1),
name1   varchar2(4),
tbl2_ID number(1));

insert into tbl1 values (1,'山田',1);
insert into tbl1 values (2,'佐藤',2);
insert into tbl1 values (3,'鈴木',3);
insert into tbl1 values (4,'池田',null);

create table tbl2(
tbl2_ID number(1),
tel     varchar2(12));

insert into tbl2 values (1,'052-111-xxxx');
insert into tbl2 values (2,'052-222-xxxx');
insert into tbl2 values (3,'052-333-xxxx');

create table tbl3(
tbl3_ID number(1),
tbl2_ID number(1),
mail    varchar2(15));

insert into tbl3 values (1,1,'yamada@test.com');
insert into tbl3 values (2,2,'sato@test.com');
commit;


SQL

--■■■スカラー問い合わせを使う方法■■■
select name1,
(select b.tel from tbl2 b where b.tbl2_ID = a.tbl2_ID) as tel,
(select c.mail from tbl3 c
  where c.tbl2_ID =(select b.tbl2_ID from tbl2 b
                     where b.tbl2_ID = a.tbl2_ID)) as mail
from tbl1 a
order by tbl1_ID;

--■■■外部結合を使う方法1■■■
select a.name1,b.tel,c.mail
  from tbl1 a,tbl2 b,tbl3 c
 where a.tbl2_ID = b.tbl2_ID(+)
   and b.tbl2_ID = c.tbl2_ID(+)
order by a.tbl1_ID;

--■■■外部結合を使う方法2■■■
select a.name1,b.tel,c.mail
  from tbl1 a Left Join tbl2 b
 using (tbl2_ID)
  Left Join tbl3 c
 using (tbl2_ID)
order by tbl1_ID;


解説

エンティティ間が、多対一、もしくは、1対1の場合は、
select句でスカラー問い合わせを使って、データを取得できます。