質問: 差集合について 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を書けばよいでしょうか?
回答: 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があると有効になる場合が多いです。