現在MySQLでは完全外部結合は使用できません
OracleやPostgresでは使用できるのですが、不便ですね
目次
完全外部結合とは
AとBの両方に存在するレコードを『すべて』抽出します
MySQLで完全外部結合(Full Outer Join)する方法
代替策として、Left Outer JoinとRigth Outer Joinの結果をUnionします。
select A.No, A.商品名, A.発注日, B.納品日
from A
left outer join B
on A.No = B.No
UNION
select B.No, A.商品名, A.発注日, B.納品日
from A
right outer join B
on A.No = B.No
Left Outer JoinしたものとRight Outer Joinしたものをガッチャンコします
Full Outer Joinを使用した場合と比べて、SQL文の長さが2倍になりますが仕方なし
ちなみにFull Outer Joinを使った場合はこのようになります
select ・・・
from A
full outer join B
on A.No = B.No
すごくスッキリしますね
片方のテーブル情報を優先的に採用したい場合
A,Bの両方に『納品日』が登録されています
このときAのほうを優先的に取得する方法です
select
A.No, A.商品名, A.発注日,
case when (A.納品日 is not null and A.納品日 <> '') then A.納品日
else B.納品日 end as 納品日
from A
left outer join B
on A.No = B.No
UNION
select
B.No, A.商品名, A.発注日,
case when (A.納品日 is not null and A.納品日 <> '') then A.納品日
else B.納品日 end as 納品日
from A
right outer join B
on A.No = B.No
Noが”355556”の納品日は”2021/06/08”を取得することができました
A.納品日が登録されている場合はAを、されていない場合はBを取得するCase文をいれます
コメント