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