コマンド道場
FULL OUTER JOIN難易度 ★★★★

UNION で代用する

FULL OUTER JOIN を使わずに、社員と部署をどちらの行も落とさずに突き合わせてください。MySQL のように完全外部結合が無い製品でも動く書き方にします。列は「name, busho_name」の順、部署名の昇順(NULL は最後)、同じならば社員名の昇順(NULL は最後)に並べてください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / SQLite / Oracle Database

  • MySQL では使えませんORDER BY ... NULLS LAST
  • MariaDB では使えませんORDER BY ... NULLS LAST
  • SQL Server では使えませんORDER BY ... NULLS LAST

未確認: IBM Db2

製品ごとの対応表(実測)を見る

  • ⚠️ この書き方の目的は「完全外部結合が無い製品でも動かす」ことですが、並べ替えの NULLS LAST は MySQL・MariaDB・SQL Server にはありません。それらの製品では、並べ替えのキーに (列 IS NULL) を足して代用します。
  • 左外部結合の結果と右外部結合の結果を UNION でまとめると、完全外部結合と同じ集合になります。
  • UNION は重複を取り除くので、両方に現れる行が二重になりません。ここで UNION ALL を使うと重複します。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

7

NULL
🔑int不可
text不可
int
データを見る(先頭 5 行)
busho_idbusho_nameparent_busho_id
1経営NULL
2開発1
3営業1
4管理1
5基盤2

18

NULL
🔑int不可
text不可
int
int
numeric(10,0)不可
date不可
date
データを見る(先頭 5 行)
shain_idnamebusho_idjoushi_idsalaryhired_ontaishoku_on
1鈴木1NULL9800002014-04-01NULL
2佐藤217200002016-10-01NULL
3田中225200002019-04-01NULL
4中村225300002020-04-01NULL
5小林224450502024-04-01NULL

解説

結論

完全外部結合は、左外部結合と右外部結合の UNION で代用できます。

なぜ

完全外部結合の結果は「左を全部残した集合」と「右を全部残した集合」の和集合です。両方に現れる行(相手がいる行)は重複するので、重複を取り除く UNION を使います。UNION ALL にすると同じ行が 2 度出ます。

⚠️ この書き方が要るのは、MySQL や MariaDB のように完全外部結合を持たない製品で動かすときです。使える製品ではそのまま FULL OUTER JOIN を書く方が読みやすく、処理も 1 回で済みます。

よくある間違い

①片側だけで済ませる ②UNION ALL にして重複が残る。

FULL OUTER JOIN の使い方をはじめから読む

根拠(一次情報)