【Oracle】MINUSで差分を取得しよう!

Oracle

前回は、2つのSELECT文からそれぞれの検索結果を足し合わせた結果(和集合)を返してくれる、UNION と UNION ALL について説明しました。今回は、2つのSELECT文のデータの差分が取得できるMINUSについて説明します!

差集合

MINUS
差集合
最初の検索結果から
次の検索結果と重複する
部分を取り除いたもの
差集合のイメージ

データ準備

MINUS を試すためにテーブルを作成し、データを追加します。

-- テーブルの作成
-- 商品テーブル1
CREATE TABLE product_info_1 (
    product_id NUMBER PRIMARY KEY,
    product_name VARCHAR2(100),
    description VARCHAR2(200),
    price NUMBER
);

-- 商品テーブル2
CREATE TABLE product_info_2 (
    product_id NUMBER PRIMARY KEY,
    product_name VARCHAR2(100),
    description VARCHAR2(200),
    price NUMBER
);

-- データの登録
-- 商品テーブル1
INSERT
  ALL INTO product_info_1
VALUES
  (1, 'コカ・コーラ', '350ml',  135)
INTO
  product_info_1
VALUES
  (2, 'コカ・コーラ', '500ml',  170)
SELECT
  *
FROM
  DUAL;

-- 商品テーブル2
INSERT
  ALL INTO product_info_2
VALUES
  (1, 'コカ・コーラ', '350ml',  135)
INTO
  product_info_2
VALUES
  (2, 'コカ・コーラ', '500ml',  170)
INTO
  product_info_2
VALUES
  (3, 'コカ・コーラ', '750ml',  230)
SELECT
  *
FROM
  DUAL;
商品ID商品名商品詳細価格
1コカ・コーラ350ml135
2コカ・コーラ500ml170
商品テーブル1
商品ID商品名商品詳細価格
1コカ・コーラ350ml135
2コカ・コーラ500ml170
3コカ・コーラ750ml230
商品テーブル2

MINUSの使い方

2つのSELECT文のデータの差分を取得する場合はMINUSを使います。MINUS は下記のように記述します。

SELECT 文1
MINUS
SELECT 文2

商品テーブル1 – 商品テーブル2 で差分を取得したいと思います。

SELECT
  product_id AS "商品ID",
  product_name "商品名",
  description AS "商品詳細",
  price AS "価格"
FROM
  product_info_1
MINUS
SELECT
  product_id AS "商品ID",
  product_name "商品名",
  description AS "商品詳細",
  price AS "価格"
FROM
  product_info_2

結果は no data found 逆に 商品テーブル2 – 商品テーブル1をすると…

SELECT
  product_id AS "商品ID",
  product_name "商品名",
  description AS "商品詳細",
  price AS "価格"
FROM
  product_info_2
MINUS
SELECT
  product_id AS "商品ID",
  product_name "商品名",
  description AS "商品詳細",
  price AS "価格"
FROM
  product_info_1

結果が返ってきました。

商品ID商品名商品詳細価格
3コカ・コーラ750ml230
商品テーブル2 – 商品テーブル1

商品テーブル1には商品テーブル2と同じデータしかなかったので、no data found になり商品テーブル2には商品テーブル1にないレコードが1つあったため結果が返ってきました。

まとめ

異なるテーブルにあるデータの差分を調べるには、MINUSを使うということを覚えておきましょう!

コメント

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