アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問があるのですが、よろしくお願いいたします。

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なので、消す

お解りの方、アドバイスを頂ければ幸いです。

よろしくお願いします。

A 回答 (4件)

#1のかたが書かれているように


DELETE FROM {テーブル名}
WHERE id_no NOT IN (
SELECT id_no FROM {テーブル名}
WHERE status = 1 )
で大丈夫です!
テスト済み!!
    • good
    • 0
この回答へのお礼

テストしてくれたんですね!

こちらでも確認できました。

ありがとうございます。

お礼日時:2004/08/04 13:02

DELETE FROM 待ち合わせ


WHERE id_no NOT IN (SELECT id_no FROM 待ち合わせ WHERE status <> 0 GROUP BY id_no)

ではいかがでしょうか?
    • good
    • 0
この回答へのお礼

NOTを使うっていう、発想がでてくれば、もうすこしスムーズに行ったかと悔しく思っています。

SQLって、いろんな発想が必要なんですね。

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

お礼日時:2004/08/04 13:09

普段 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 になります。

もっと、簡単なクエリーがあるとは思いますが
取り急ぎ思いついたものを・・・

あっ、絶対バックアップとって実験してくださいね(^^;)
    • good
    • 0
この回答へのお礼

なるほど、MAX関数を使うやりかたですね。いい発想ですね。確かに、一つでも含まれると最大値が変わる。

SQLだけでなく、他の言語でも使えそうな発想ですね。

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

お礼日時:2004/08/04 13:01

環境がないので試せないのですが、以下のような感じでどうでしょう?


テーブルをAとしました。

delete from A where id_no not =
(select id_no from A where status = 1)

もしかしたら not = ではなく not in かもしれません。
    • good
    • 0
この回答へのお礼

すばやい回答ありがとうございました。

サブクエリーを使って、”含まれないものを探す”みたいなイメージですかね。

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

お礼日時:2004/08/04 12:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す