本記事では、
Oracleでテーブル同士の重複行を取得することができるINTERSECTの使い方を紹介する。
集合演算子 「INTERSECT」
Oracleの集合演算子である「INTERSECT」を使えば、
2つのテーブルを比較して、共通するレコードを抽出することが可能である。

その際、重複行は抽出されない。
INTERSECT構文
以下が「INTERSECT」の構文となる。
SELECT 列1, 列2,・・・ FROM <テーブル名1>
INTERSECT
SELECT 列1, 列2,・・・ FROM <テーブル名2>;
UNIONなどと同じ様に、テーブル同士を繋ぐ様な使い方をするのが分かるだろう。
このとき指定するテーブル同士のカラムは一致している必要がある。
INTERSECTで重複行を取得するサンプル
ここからは実際にINTERSECTを使ってテーブル同士の重複行を取得するサンプルを紹介していく。
サンプルでは以下の2つのテーブルとデータを使用していく。
ANIMAL1テーブル
id | name | address |
1 | イカ | 海 |
2 | たぬき | 陸 |
3 | かもめ | 空 |
4 | イカ | 海 |
ANIMAL2テーブル
id | name | address |
1 | イカ | 海 |
2 | たぬき | 陸 |
5 | かもめ | 空 |
① INTERSECTの実行例
「ANIMAL1」テーブルと「ANIMAL2テーブル」の2つのテーブルから、共通のレコードを抽出してみる。以下のSQLを実行してみる。
SELECT id, name ,address FROM animal1
INTERSECT
SELECT id, name ,address FROM animal2;
実行結果
ID | NAME | ADDRESS |
1 | イカ | 海 |
2 | たぬき | 陸 |
INTERSECTを使用した結果、id, name, address のそれぞれの値が全て一致するレコードである、イカとたぬきのレコードが取得されているのが分かるだろう。
② 「INTERSECT」は重複行は取得しない
冒頭でも記述したように「INTERSECT」は重複行を取得しない。
上記を検証するために、以下のSQLを実行してみる。
SELECT name ,address FROM animal1
INTERSECT
SELECT name ,address FROM animal2;
実行結果
ID | NAME | ADDRESS |
1 | イカ | 海 |
2 | たぬき | 陸 |
nameとaddressの一致だけでいけば、「イカ」のレコードは2行取得されることになると思うが、「イカ」のレコードは1行しか抽出しなかった。
上記の様に、INTERSECTでは、結果として各レコードの値が全て同一である行のうち1レコードのみ取得する。つまり、重複行になっている行の重複分は取得しないと言う決まりがある。
なので、最終的に、2行あったはずの「イカ」のレコードは、1行に集約されて表示されたと言うわけである。
関連記事
https://www.shift-the-oracle.com/sql/intersect-operator.html
https://docs.oracle.com/cd/E57425_01/121/SQLRF/queries004.htm
INTERSECTと似た機能を持つUNION(UNION ALL)はよく混同してしまうが、
こちらはテーブル同士の和集合を取得する関数となっている。
記事を取得できませんでした。記事IDをご確認ください。