- ベストアンサー
こういうDELETE文を作成したいのですが
質問があるのですが、よろしくお願いいたします。 Oracle8iでDELETEの処理を考えています。 [待ち合わせ]テーブル id_no status ------------------ 1000 0 1000 0 2000 1 3000 0 3000 1 4000 0 4000 0 4000 0 以上のようなテーブルがある時に、同一のid_noでstatusがすべて0の時は、レコードを消すという処理を行う。またstatusに1が含まれるid_noは消さないという事を行いたいのですが、DELETE文の条件が解りません。GROUP句を使えばいいのかと思うのですが、うまく行きません。 以下の結果になる事を望んでいます。 id_no status ------------------ 2000 1 3000 0 3000 1 [1000] - statusが2レコードとも0なので、消す [2000] - statusが1なので、そのまま [3000] - statusが2レコードとも0でないので、そのまま [4000] - statusが3レコードとも0なので、消す お解りの方、アドバイスを頂ければ幸いです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1のかたが書かれているように DELETE FROM {テーブル名} WHERE id_no NOT IN ( SELECT id_no FROM {テーブル名} WHERE status = 1 ) で大丈夫です! テスト済み!!
その他の回答 (3)
- rotesKomet
- ベストアンサー率31% (83/265)
DELETE FROM 待ち合わせ WHERE id_no NOT IN (SELECT id_no FROM 待ち合わせ WHERE status <> 0 GROUP BY id_no) ではいかがでしょうか?
お礼
NOTを使うっていう、発想がでてくれば、もうすこしスムーズに行ったかと悔しく思っています。 SQLって、いろんな発想が必要なんですね。 ありがとうございました。
- togino
- ベストアンサー率75% (97/129)
普段 PostgreSQL 使っているので微妙に SQL が 違うかもしれませんが・・・ DELETE FROM table WHERE id_no IN ( SELECT id_no FROM table GROUP BY id_no HAVING max(status) = 0) まず、table を id_no で GROUP BY します。 でそのグループごとに、status の最大値を求めます。 1が1つでも含まれたら 最大値は1になってしまいますよね。 だから、最大値が0ということは、すべてが0ってことです。 これらの id_no をサブクエリーの結果として返し その is_no をすべて削除するって SQL になります。 もっと、簡単なクエリーがあるとは思いますが 取り急ぎ思いついたものを・・・ あっ、絶対バックアップとって実験してくださいね(^^;)
お礼
なるほど、MAX関数を使うやりかたですね。いい発想ですね。確かに、一つでも含まれると最大値が変わる。 SQLだけでなく、他の言語でも使えそうな発想ですね。 ありがとうございました。
環境がないので試せないのですが、以下のような感じでどうでしょう? テーブルをAとしました。 delete from A where id_no not = (select id_no from A where status = 1) もしかしたら not = ではなく not in かもしれません。
お礼
すばやい回答ありがとうございました。 サブクエリーを使って、”含まれないものを探す”みたいなイメージですかね。 ありがとうございました。
お礼
テストしてくれたんですね! こちらでも確認できました。 ありがとうございます。