- 締切済み
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について知識がなく、困っています。どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
> 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)
delete from b where exists( select * from a where a.category <> 2 and a.b_id = b.id); ですかね。 MySQLの環境がないので動作確認はしていません。
補足
さっそくのご回答ありがとうございます。上の質問内容の通り、テーブル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関数がとてもヒントになりそうなので、これから自分でも調べてみます!