• ベストアンサー

こういう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なので、消す お解りの方、アドバイスを頂ければ幸いです。 よろしくお願いします。

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

  • ベストアンサー
回答No.3

#1のかたが書かれているように DELETE FROM {テーブル名} WHERE id_no NOT IN ( SELECT id_no FROM {テーブル名} WHERE status = 1 ) で大丈夫です! テスト済み!!

80yen
質問者

お礼

テストしてくれたんですね! こちらでも確認できました。 ありがとうございます。

その他の回答 (3)

回答No.4

DELETE FROM 待ち合わせ WHERE id_no NOT IN (SELECT id_no FROM 待ち合わせ WHERE status <> 0 GROUP BY id_no) ではいかがでしょうか?

80yen
質問者

お礼

NOTを使うっていう、発想がでてくれば、もうすこしスムーズに行ったかと悔しく思っています。 SQLって、いろんな発想が必要なんですね。 ありがとうございました。

  • togino
  • ベストアンサー率75% (97/129)
回答No.2

普段 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 になります。 もっと、簡単なクエリーがあるとは思いますが 取り急ぎ思いついたものを・・・ あっ、絶対バックアップとって実験してくださいね(^^;)

80yen
質問者

お礼

なるほど、MAX関数を使うやりかたですね。いい発想ですね。確かに、一つでも含まれると最大値が変わる。 SQLだけでなく、他の言語でも使えそうな発想ですね。 ありがとうございました。

noname#86752
noname#86752
回答No.1

環境がないので試せないのですが、以下のような感じでどうでしょう? テーブルをAとしました。 delete from A where id_no not = (select id_no from A where status = 1) もしかしたら not = ではなく not in かもしれません。

80yen
質問者

お礼

すばやい回答ありがとうございました。 サブクエリーを使って、”含まれないものを探す”みたいなイメージですかね。 ありがとうございました。

関連するQ&A