「ブロック機能」のリニューアルについて

テーブル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
のエラーが出ます。
何か方法はありますか?

教えて!goo グレード

A 回答 (4件)

#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/manu …
    • good
    • 0

MySQLの質問をする場合は、バージョンを書きましょう。



「EXCEPT」は、MySQLでは未サポートのようです。

差分検索なら、NOT EXISTSがすぐに思い浮かびます。

select * from abc
where not exists
(select * from xyz where abc.`id`=`id`);
    • good
    • 0
この回答へのお礼

できました。
ありがとうございます。

お礼日時:2006/05/25 01:56

MySQLでは「except」はサポートされていません。


単純な方法として、表結合し、abc.ID != xyz.id を条件にabcのテーブルからIDを取り出すというのはいかがですか?
    • good
    • 0
この回答へのお礼

参考になります。

お礼日時:2006/05/25 01:57

MySQLはバージョンによって挙動が大きく


ことなります。バージョンをハッキリさせた方が
回答がしやすいです。

とりあえず、以下であれば3.23系でも検出できます

SELECT `abc`.`ID` AS `ID` , `xyz`.`ID` AS `XID`
FROM `abc`
LEFT JOIN `xyz` ON `abc`.`ID` = `xyz`.`ID`
HAVING ISNULL(`XID`)

この回答への補足

バージョンは5.0です。
ご解答のLEFT JOIN `xyz` ON `abc`.`ID` = `xyz`.`ID`の「ON」はどういう意味ですか?

補足日時:2006/05/25 01:55
    • good
    • 0

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


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング