• 締切済み

MySQLで別テーブルを参照し、レコードを消したい

お世話になります。MySQL4のデータベース上に2つのテーブルがあるのですが、 片方のテーブル(a)にあるフィールド(b_id)の値を参照し、もう片方のテーブル(b)のレコードを消していきたいのです。 具体的には以下のようなテーブル(a)とテーブル(b)があります。 TBL: a =========================== id    b_id    category =========================== 0     1       3 --------------------------- 1     2       1 --------------------------- 2     3       2 --------------------------- 3     4       2 --------------------------- TBL: b =========================== id    name    price =========================== 0    goodsA   1,000 --------------------------- 1    goodsB   500 --------------------------- 2    goodsC   250 --------------------------- 3    goodsD   2,500 --------------------------- 4    goodsE    1,800 --------------------------- やりたいことは、テーブル(a)の「category」フィールドが「2」以外であれば、 そのレコードの「b_id」にある数値を「id」にもつ、テーブル(b)のレコードを消していきたいのです。 上記の例だと、テーブル(a)のid「0」と「1」がcategoryに「2」以外を持っています。 この2つのレコードのb_idは「1」と「2」ですので、テーブル(b)のid「1」と「2」を消したいと思っています。 SQLについて知識がなく、困っています。どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。

みんなの回答

回答No.2

> MySQL4のデータベース上に 「MySQL4」などというバージョンの提示は、提示していないのと同じです。MySQL 4.1、5.0といったレベルまでは、最低限で提示するようにしてください。 すぐに思い出すだけでも、MySQL 4.0と4.1では、次のような大きな機能追加や一部の仕様変更があります。 MySQL 4.0まで・・・一部のジョイン、union、一時表などは実装済み MySQL 4.1・・・サブクエリの実装、ジョインの拡張、unicodeの実装。それにより、varchar(n)のnが、バイト数から文字数に仕様変更 MySQL 5.0・・・ビュー表、ストアドプロシジャ、トリガなどの実装 #1さんからexistsを使った具体的なSQL例が提示されていますが、構文エラーになったとのこと。サブクエリは、MySQL 4.1での実装ですが、MySQL 4.0を使っているのでは? MySQL 4.0で動くかどうか不明ですが、MySQLには他表を利用したdelete文に、独自構文があります。 -- MySQLのdelete文の独自構文 delete b from a,b where category<>2 and a.b_id=b.id

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

delete from b where exists( select * from a where a.category <> 2 and a.b_id = b.id); ですかね。 MySQLの環境がないので動作確認はしていません。

manimani2
質問者

補足

さっそくのご回答ありがとうございます。上の質問内容の通り、テーブルaとbを作成し、ご回答いただいたSQL文を打ち込んでみました。 mysql> delete from b -> where exists( -> select * -> from a -> where a.category <> 2 -> and a.b_id = b.id); ERROR 1064: 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 'exists( select * from a where a.category <> 2 and a.b_id = b.id という具合でシンタックスエラーが出てしまいました。ただ、EXISTS関数がとてもヒントになりそうなので、これから自分でも調べてみます!

関連するQ&A