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;
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が理解できるので、 他の外部結合の構文よりも可読性が高くなります。