(Oracle) INTERSECTでテーブル同士の重複行を取得する

(Oracle) INTERSECTでテーブル同士の重複行を取得する

 

本記事では、
Oracleでテーブル同士の重複行を取得することができるINTERSECTの使い方を紹介する。

 

集合演算子 「INTERSECT」

Oracleの集合演算子である「INTERSECT」を使えば、
2つのテーブルを比較して、共通するレコードを抽出することが可能である。

sqlのintersectの概念図

その際、重複行は抽出されない

 

参考:UNION(UNION ALL)

INTERSECTと似た機能を持つUNION(UNION ALL)はよく混同してしまうが、
こちらはテーブル同士の和集合を取得する関数となっている。

記事を取得できませんでした。記事IDをご確認ください。

 

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行に集約されて表示されたと言うわけである。

 

関連記事

(Oracle) DISTINCT でselect結果から重複を無くす
(Oracle) CASEで条件を分ける【DECODEとの違いも解説】

 

https://www.shift-the-oracle.com/sql/intersect-operator.html

https://docs.oracle.com/cd/E57425_01/121/SQLRF/queries004.htm

 

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。