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

過去ログを探っていろいろ試したのですが、うまくいかないので
教えてください。
TABLE1 に存在しない TABLE2 のデータをDELETEしたいのですが
TABLE2 の対象年月(item2の内容)が、指定年月以上の条件で
DELETEしたいのです。

●指定月=2008/02 の場合

<TABLE1>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12

<TABLE2>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12
d   d   d   え   2008/01 (削除しない)
e   e   e   お   2008/03 (削除対象)

<DELETE結果 TABLE2>
key1 key1 key1 item1  item2
a   a   a   あ   2007/12
b   b   b   い   2007/12
c   c   c   う   2007/12
d   d   d   え   2008/01

よろしくお願いします。
(環境:SQL Server2005 Standard)

A 回答 (2件)

SQL Server の場合、よく使うのは3パターンです。


状況に応じ使い分けられると便利なので、一応3つ書いときます。

--JOIN
DELETE TABLE2
FROM TABLE2 t2
LEFT OUTER JOIN TABLE1 t1 ON t1.KEY1=t2.KEY1 AND t1.KEY2=t2.KEY2 AND t1.KEY3=t2.KEY3
WHERE t1.KEY1 IS NULL
AND t2.ITEM2>='2008/02'

--EXISTS Clause
DELETE TABLE2
FROM TABLE2 t2
WHERE NOT EXISTS
(SELECT NULL FROM TABLE1 t1
WHERE t1.KEY1=t2.KEY1 AND t1.KEY2=t2.KEY2 AND t1.KEY3=t2.KEY3)
AND t2.ITEM2>='2008/02'

--IN Clause
DELETE FROM TABLE2
WHERE KEY1+'*'+KEY2+'*'+KEY3 NOT IN
(SELECT KEY1+'*'+KEY2+'*'+KEY3 FROM TABLE1)
AND ITEM2>='2008/02'
    • good
    • 3
この回答へのお礼

3種類の対応例、大変参考になります!
「--JOIN」のケースで早速試してみます。

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

お礼日時:2008/09/21 00:16

Table1とTable2をkeyでLEFT JOINして「Table1.keyがnullになっていて、かつ、Table2.item2が指定日より大きいか等しい」と言う条件をWhere句に指定したSelect文を作りましょう。



そのSelect文で「消したい物だけ抽出出来た」なら、あとは、そのSelect文をDelete文に直すだけです。
    • good
    • 0
この回答へのお礼

ご指摘の通りの手順でやってみたのですが、うまくいかなかった
ものですから・・・
where句の指定内容に不備があるかもしれませんね。確認してみます。

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

お礼日時:2008/09/21 00:06

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

このQ&Aを見た人はこんなQ&Aも見ています

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