【Oracle】INTERSECTで重複を取得しよう!

Oracle

前回は、2つのSELECT文のデータの差分が取得できるMINUSについて説明しました。今回は、2つのSELECT文の重複データが取得できるINTERSECTについて説明します!

積集合

INTERSECT
積集合
2つの検索結果で
重複するもの
積集合のイメージ

データ準備

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

-- テーブルの作成
-- 従業員テーブル1
CREATE TABLE employees1 (
    employee_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50),
    last_name VARCHAR2(50),
    hometown VARCHAR2(100),
    department_id NUMBER
);

-- 従業員テーブル2
CREATE TABLE employees2 (
    employee_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50),
    last_name VARCHAR2(50),
    hometown VARCHAR2(100),
    department_id NUMBER
);

-- データの登録
-- 従業員テーブル1
INSERT
  ALL INTO employees1
VALUES
  (1, '太郎', '佐藤', '東京', 101)
INTO
  employees1
VALUES
  (2, '次郎', '鈴木', '大阪', 102)
INTO
  employees1
VALUES
  (3, '三郎', '田中', '京都', 101)
INTO
  employees1
VALUES
  (4, '四郎', '山田', '福岡', 103)
INTO
  employees1
VALUES
  (5, '五郎', '斉藤', '札幌', 102)
SELECT
  *
FROM
  DUAL;

-- 従業員テーブル2
INSERT
  ALL INTO employees2
VALUES
  (6, '六郎', '佐藤', '東京', 101)
INTO
  employees2
VALUES
  (7, '七郎', '鈴木', '大阪', 102)
INTO
  employees2
VALUES
  (8, '八郎', '山本', '名古屋', 104)
INTO
  employees2
VALUES
  (9, '九郎', '中村', '神戸', 103)
INTO
  employees2
VALUES
  (10, '十郎', '小林', '札幌', 102)
SELECT
  *
FROM
  DUAL;
従業員ID出身地部門ID
1太郎佐藤東京101
2次郎鈴木大阪102
3三郎田中京都101
4四郎山田福岡103
5五郎斉藤札幌102
従業員テーブル1
従業員ID出身地部門ID
6六郎佐藤東京101
7七郎鈴木大阪102
8八郎山本名古屋104
9九郎中村神戸103
10十郎小林札幌102
従業員テーブル2

INTERSECTの使い方

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

SELECT 文1
INTERSECT
SELECT 文2

試しに、従業員テーブル1と従業員テーブル2の出身地で重複しているデータを取得してみます。

SELECT
  hometown AS "出身地"
FROM
  employees1
INTERSECT
SELECT
  hometown AS "出身地"
FROM
  employees2

ちゃんと重複しているデータが取得できました。

出身地
東京
大阪
京都
福岡
札幌
東京
大阪
名古屋
神戸
札幌
UNION ALL
出身地
大阪
札幌
東京
INTERSECT

左の表は従業員テーブル1と従業員テーブル2を合わせて取得したもので、上記の表はそこから重複しているデータのみ取得しています。

部門IDや性も重複しているデータが存在します。

ぜひ、手を動かして INTERSECT を使ってみてください。

まとめ

異なるテーブルから重複しているデータを取得する時は、INTERSECTを使う!ということを覚えておきましょう。

コメント