• ベストアンサー

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

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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/manual.ja_Reference.html#JOIN

その他の回答 (3)

回答No.3

MySQLの質問をする場合は、バージョンを書きましょう。 「EXCEPT」は、MySQLでは未サポートのようです。 差分検索なら、NOT EXISTSがすぐに思い浮かびます。 select * from abc where not exists (select * from xyz where abc.`id`=`id`);

koton_
質問者

お礼

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

  • inui07
  • ベストアンサー率0% (0/1)
回答No.2

MySQLでは「except」はサポートされていません。 単純な方法として、表結合し、abc.ID != xyz.id を条件にabcのテーブルからIDを取り出すというのはいかがですか?

koton_
質問者

お礼

参考になります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

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`)

koton_
質問者

補足

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

関連するQ&A