MySQLで簡単に完全外部結合(Full Outer Join)する方法

MySQLで簡単に完全外部結合する方法 SQL

現在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文をいれます

コメント

タイトルとURLをコピーしました