フリーランスエンジニアの岩井です。
ちょうど今日、どう見ても問題なさそうなSQLで詰まったので展開します。
OracleでSQLを使ってデータを操作する際に、UNION ALL を利用して複数のSELECT結果を結合することはよくあります。しかし、カラムの順番を誤ると、意図しない結果が出ることがあります。この記事では、その具体的な例と正しい使い方について解説します。
UNION ALL は、複数のSELECT文の結果を単純に結合するSQLの演算子です。UNION との違いは、重複を削除せずそのまま全件を結合する 点にあります。
基本的な構文
SELECT カラム1, カラム2 FROM テーブルA
UNION ALL
SELECT カラム1, カラム2 FROM テーブルB;
カラムの順番を間違えるとどうなるか?
重要なのは、UNION ALL
ではカラム名ではなく、カラムの順番でデータが対応する という点です。
異なるテーブルからデータを結合する際に、カラムの順番を間違えると、データが意図しない形で出力される可能性があります。
例えば、次のような2つのテーブルがあるとします。
table_a
id | name |
---|---|
1 | Alice |
2 | Bob |
table_b
name | id |
---|---|
Charlie | 3 |
Dave | 4 |
この2つのテーブルをUNION ALL
で結合するSQLを実行するとします。
SELECT id, name FROM table_a
UNION ALL
SELECT name, id FROM table_b;
このSQLの結果はどうなるでしょうか?
id | name |
---|---|
1 | Alice |
2 | Bob |
Charlie | 3 |
Dave | 4 |
❗ 問題点
このように、カラムの順番を間違えると、異なるデータ型のカラムが混ざったり、意図しない値が出力される ことになります。
この問題を防ぐためには、SELECT 文のカラムの順番を統一することが重要です。
SELECT id, name FROM table_a
UNION ALL
SELECT id, name FROM table_b;
このように、両方の SELECT 文で カラムの順番を揃える ことで、意図した結果が得られます。
UNION ALL を使うときのポイントは以下の通りです。
✅ カラムの順番を必ず統一する
✅ カラムのデータ型も一致しているか確認する
✅ UNION ALL はカラム名ではなく、カラムの順番でデータをマッピングする
ちょっとしたミスで意図しない結果が出てしまうので、SQLを書く際はカラムの順番に注意しましょう!