ここから質問投稿すると、最大4000ポイント当たる!!!! >>

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSのSQL

最近ACCESSを勉強していて、色々なデータベースに関する参考書を見て勉強しているのですが、ACCESSのSQLで和集合演算(UNION)は分かったのですが、積集合演算、差集合演算についてのSQLが分かりません。ACCESSではINTERSECT(積集合演算)でやるとエラーになってしまうので、この積集合演算、差集合演算について、SQLをご教授願います。

Aベストアンサー

>というか、LEFT JOIN や INNER JOIN がサポートされないDB製品はないと思います。

Oracleの8i以前の製品とか、無いことも無かったり(^^;;


INTERSECTやEXCEPTといった集合演算子は、サポートされていないDBは結構あります。

これらは、結合させたり、EXISTSやNOT EXISTSを組み合わせで求めるしかありません。
http://www.geocities.jp/xmldtp/ac_intersect.htm

QMySQLでのEXCEPTについて

テーブルabcに
+----+
| ID |
+----+
| 001|
| 002|
| 003|
| 004|
+----+

テーブルxyzに
+----+
| ID |
+----+
| 002|
| 003|
| 005|
+----+

のとき、
select * from abc
except
select * from xyz;
として、abcに属し、xyzには属さないIDを出したいのですが、
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'selec
t * from xyz' at line 3
のエラーが出ます。
何か方法はありますか?

Aベストアンサー

#1です。

あらら・・・MySQL5ですか。副問合わせができる
ものはそちらでなさる方がパフォーマンスが
あがるでしょうね。

ちなみにJOIN構文は以下のサイトを参照ください。
「LEFT JOIN `hoge` ON 条件」は
「LEFT JOIN `hoge` WHERE 条件 」と同意です。
プログラムにSQLを渡すときにはWHERE句は1度しか
表記できないため前者の方がすっきりとした
コードになります。

参考URL:http://www.mysql.gr.jp/Manual/mysql-3.23.49/manual.ja_Reference.html#JOIN

QSQLで違うテーブルの値を比較して値に差があるレコードを抽出したいので

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu2002/07/05
XXXXXXX XX1takeshiokada2005/07/15
XXXXXXX XX1kamoshu1857/09/25
WWCWWCW WW2waowao2008/10/22
DDDDDDD DD1uihhh2006/06/30
DDDDDDD DD1jojoj x5xx1999/09/09
DDDDDDD DD1momohara2005/03/07
DDDDDDD DD1itaiu-2003/12/22
DDDDDDD DD1komanogoal2007/04/26
GGGGGGG GX9 damerecord2009/11/14
FFFFFFF USJ ikitai1995/08/15
FFFFFFF USJ sstebuspi2004/01/05
FFFFFFF USJ bbpp2009/08/23

A1とB1は主キー、A2とB2は副キーです。
Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。(主キー、副キーが同じものの)
しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。
こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。
よろしくお願いいたします。

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu200...続きを読む

Aベストアンサー

SELECT A.* FROM Aテーブル A
INNER JOIN
TABLE(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2) B
ON A.A1=B.B1 AND A.A2=B.B2
AND A.A4<>B.SU

または

WITH B(B1,B2,SU) AS
(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2)
SELECT A.* FROM Aテーブル A
INNER JOIN B ON A.A1=B.B1
AND A.A2=B.B2 AND A.A4<>B.SU

こんなのでどうでしょうか?
後者の方が標準的(他のDBシステムでも
使える可能性が高い)かと思います。


人気Q&Aランキング