トップページに戻る
次の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句でスカラー問い合わせを使って、データを取得できます。