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_id | busho_name | parent_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_id | name | busho_id | joushi_id | salary | hired_on | taishoku_on |
|---|---|---|---|---|---|---|
| 1 | 鈴木 | 1 | NULL | 980000 | 2014-04-01 | NULL |
| 2 | 佐藤 | 2 | 1 | 720000 | 2016-10-01 | NULL |
| 3 | 田中 | 2 | 2 | 520000 | 2019-04-01 | NULL |
| 4 | 中村 | 2 | 2 | 530000 | 2020-04-01 | NULL |
| 5 | 小林 | 2 | 2 | 445050 | 2024-04-01 | NULL |
解説
結論
完全外部結合は、左外部結合と右外部結合の UNION で代用できます。
なぜ
完全外部結合の結果は「左を全部残した集合」と「右を全部残した集合」の和集合です。両方に現れる行(相手がいる行)は重複するので、重複を取り除く UNION を使います。UNION ALL にすると同じ行が 2 度出ます。
⚠️ この書き方が要るのは、MySQL や MariaDB のように完全外部結合を持たない製品で動かすときです。使える製品ではそのまま FULL OUTER JOIN を書く方が読みやすく、処理も 1 回で済みます。
よくある間違い
①片側だけで済ませる ②UNION ALL にして重複が残る。
根拠(一次情報)
- PostgreSQL 18 マニュアル: 結合テーブル一次情報・確認 2026-08-01
- PostgreSQL 18 マニュアル: 問い合わせの結合(UNION / INTERSECT / EXCEPT)一次情報・確認 2026-08-01