Oracle SQL集合演算子: UNION ALL, UNION, INTERSECT, MINUSの使い方

Oracle Master Silver

Oracle SQLの集合演算子(UNION ALL、UNION、INTERSECT、MINUS)は、複数のSELECT文の結果セットを結合または比較する際に使用します。本記事では、それぞれの演算子の使い方を、具体的なシナリオや注意点と共に詳しく解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


集合演算子とは?

集合演算子は、複数のSQLクエリから取得された結果セットを操作するためのツールです。以下のような場面で役立ちます。

  • 複数の異なるデータソースを統合したい
  • データの重複や共通部分を整理したい
  • 差分を確認したい

この仕組みを理解することで、より柔軟かつ効率的なSQLクエリの作成が可能になります。


サンプル用の表を作成

以下のSQLでサンプル用の表を作成し、データを挿入します。これらの表は、従業員(table_a)とプロジェクトメンバー(table_b)を表すデータとして扱います。

-- 表Aの作成
CREATE TABLE table_a (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50) NOT NULL,
    value NUMBER NOT NULL
);

-- 表Bの作成
CREATE TABLE table_b (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50) NOT NULL,
    value NUMBER NOT NULL
);

-- table_aにデータを挿入
INSERT INTO table_a (id, name, value) VALUES (1, 'Alice', 100);
INSERT INTO table_a (id, name, value) VALUES (2, 'Bob', 200);
INSERT INTO table_a (id, name, value) VALUES (3, 'Charlie', 300);

-- table_bにデータを挿入
INSERT INTO table_b (id, name, value) VALUES (2, 'Bob', 200);
INSERT INTO table_b (id, name, value) VALUES (3, 'Charlie', 400);
INSERT INTO table_b (id, name, value) VALUES (4, 'David', 500);

-- コミット
COMMIT;

UNION ALL

UNION ALLは、重複を除外せずにすべての結果を結合します。この操作は、両方のデータセットを完全に統合したい場合に有用です。

例: 従業員とプロジェクトメンバーの全リストを表示

SELECT id, name, value FROM table_a
UNION ALL
SELECT id, name, value FROM table_b;

結果:

ID | NAME    | VALUE
---|---------|------
 1 | Alice   | 100
 2 | Bob     | 200
 3 | Charlie | 300
 2 | Bob     | 200
 3 | Charlie | 400
 4 | David   | 500

UNION

UNIONは、結果セットの重複を除外して結合します。重複のないユニークなデータを作成したい場合に適しています。

例: 重複を取り除いた従業員とプロジェクトメンバーのリスト

SELECT id, name, value FROM table_a
UNION
SELECT id, name, value FROM table_b;

結果:

ID | NAME    | VALUE
---|---------|------
 1 | Alice   | 100
 2 | Bob     | 200
 3 | Charlie | 300
 3 | Charlie | 400
 4 | David   | 500

注意点: 結果セットの重複を取り除くため、UNIONUNION ALLよりも処理が重くなることがあります。


INTERSECT

INTERSECTは、両方のSELECT文の結果セットに共通する行を返します。例えば、従業員リストとプロジェクトメンバーリストの両方に存在する人物を抽出する場合に使用します。これにより、複数のデータセット間の重複エントリを確認でき、データ統合や監査の際に非常に役立ちます。

例: 共通の従業員とプロジェクトメンバーを表示

SELECT id, name, value FROM table_a
INTERSECT
SELECT id, name, value FROM table_b;

結果:

ID | NAME    | VALUE
---|---------|------
 2 | Bob     | 200

活用例: 2つのシステムで共通して登録されているデータの確認に利用できます。


MINUS

MINUSは、最初のSELECT文の結果セットから、2つ目のSELECT文の結果セットを差し引いた行を返します。例えば、特定のプロジェクトに参加していない従業員を抽出する場合に使用できます。このような差分分析を行うことで、未割り当てリソースを特定したり、データのギャップを検出する際に非常に役立ちます。

例: 従業員のうちプロジェクトに参加していない人を表示

SELECT id, name, value FROM table_a
MINUS
SELECT id, name, value FROM table_b;

結果:

ID | NAME    | VALUE
---|---------|------
 1 | Alice   | 100
 3 | Charlie | 300

注意: 差分を明確にするために、順序に注意してください。逆順では異なる結果が返されます。


演算子の比較

演算子重複行の処理使用例
UNION ALL重複を除外しないすべてのデータをそのまま結合したい場合
UNION重複を除外するデータをユニークに結合したい場合
INTERSECT共通部分のみ返す両方のセットに含まれる行を取得したい場合
MINUS差分を返す特定のセットから他のセットを引きたい場合

補足: 各演算子の処理は、列数やデータ型が一致している必要があります。エラーを防ぐために、SELECT文の列定義を確認してください。


これらの集合演算子を使うことで、複数のデータセットを柔軟に操作できます。業務要件に応じて適切な演算子を選択し、効率的なクエリ作成を目指しましょう。

[参考]
Oracle Database SQL言語リファレンス 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

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