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

2-2-2 select句でサブクエリ

SQLパズル

Table1
Name  Code2  Code3  Code4
----  -----  -----  -----
aaaa    501    601    701
bbbb    502    602    999
cccc    503    999    702
dddd    999    603    703
eeee    999    999    999

Table2        Table3        Table4
Code  Name    Code  Name    Code  Val
----  ----    ----  ----    ----  ---
 501  AAAA     601  DDDD     701  123
 502  BBBB     602  EEEE     701  456
 503  CCCC     603  FFFF     701  789
                             702  321
                             702  456
                             703  987

Table1のCode2(Table2の外部キー)に紐づくTable2のNameの値、
Table1のCode3(Table3の外部キー)に紐づくTable3のNameの値、
Table1のCode4に紐づくTable4のValの値の最大値と最小値を取得する。

出力結果
Name  Code2  Code3  Code4  Name2  Name3  maxVal  minVal
----  -----  -----  -----  -----  -----  ------  ------
aaaa   501    601    701   AAAA   DDDD      789     123
bbbb   502    602    999   BBBB   EEEE     null    null
cccc   503    999    702   CCCC   null      456     321
dddd   999    603    703   null   FFFF      987     987
eeee   999    999    999   null   null     null    null


データ作成スクリプト

create table Table1(Name,Code2,Code3,Code4) as
select 'aaaa',501,601,701 from dual union
select 'bbbb',502,602,999 from dual union
select 'cccc',503,999,702 from dual union
select 'dddd',999,603,703 from dual union
select 'eeee',999,999,999 from dual;

create table Table2(Code primary key,Name) as
select 501,'AAAA' from dual union
select 502,'BBBB' from dual union
select 503,'CCCC' from dual;

create table Table3(Code primary key,Name) as
select 601,'DDDD' from dual union
select 602,'EEEE' from dual union
select 603,'FFFF' from dual;

create table Table4(Code,Val) as
select 701,123 from dual union
select 701,456 from dual union
select 701,789 from dual union
select 702,321 from dual union
select 702,456 from dual union
select 703,987 from dual;


SQL

select Name,Code2,Code3,Code4,
(select b.Name from Table2 b where b.Code=a.Code2) as Name2,
(select b.Name from Table3 b where b.Code=a.Code3) as Name3,
cursor(select max(val) as maxVal,min(val) as minVal from Table4 b
        where b.code=a.Code4) as c
from Table1 a;


解説

外部結合には、Left Joinや、(+)演算子を使用する方法がありますが
外部キーに紐づく値を取得するのであれば、エンティティ間が多対一なので、
select句でのスカラー問い合わせで取得可能です。

また、select句に記述することにより、SQL文の行数が減る上に、
SQLを上から下に読むだけで、SQLが理解できるので、
他の外部結合の構文よりも可読性が高くなります。

スカラー問い合わせ式