こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

差集合について

MYSQL5.5について質問です。

Table1.idからTable2.idを引いて差集合を得たいとと思います。

例えば、
Table1.id
001
002
003
004

Tbale2.id
002
003
004

とあれば、最終的に欲しい結果は
001
のみです。

SQLを書くと下記のようなSQLになると思います。

mysql> SELECT table1.* FROM table1
-> LEFT JOIN table2 ON table1.id=table2.id
-> WHERE table2.id IS NULL;

しかし、これで差集合が得られるのかわかりません。
left joinして、table2 is nullにすれば、差集合に
なるか教えて頂けますでしょうか?

また、not existsで代用できるみたいですが、その場合、
どのようなSQLを書けばよいでしょうか?

投稿日時 - 2011-06-30 17:22:36

QNo.6845352

困ってます

質問者が選んだベストアンサー

Table1.id、Table2.idともに主キーならLEFT JOINで差集合が得られます。
しかし
Table2のidに重複があるような場合
002
002
003
004

結合の際に複数行を生じてしまいます。
より一般的にするのなら
SELECT table1.* FROM table1
LEFT JOIN ( select distinct id frpm table2 ) t2 ON table1.id=t2.id
WHERE t2.id IS NULL;
になります。

NOT EXISTSを使うなら

SELECT * FROM TABLE1
WHERE NOT EXISTS
( SELECT 1 FROM TABLE2
WHERE TABLE1.ID=TABLE2.ID )

になります。
この場合、TABLE2のIDにINDEXがあると有効になる場合が多いです。

投稿日時 - 2011-06-30 20:28:50

お礼

勉強になります!ありがとうございます!!

投稿日時 - 2011-07-02 13:39:07

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

select Table1.id from Table1
minus
select Table2.id from Table2;

とか?

投稿日時 - 2011-07-05 09:37:17

あなたにオススメの質問