プロが教える店舗&オフィスのセキュリティ対策術

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を書けばよいでしょうか?

A 回答 (2件)

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があると有効になる場合が多いです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/02 13:39

select Table1.id from Table1


minus
select Table2.id from Table2;

とか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!