2011-02-10 8 views
3

私はDBの初心者ですが、これで苦労しています。私は、次の列を持つ既存のテーブルを持っている:SQLサーバー - 複数の列がヌルまたはゼロの値を持つ行を削除します。

Showroom, Salesperson, Time1, Time2, Time3, Dte 

私はすべての3時間の列にNULLまたは0のいずれかの値を持つテーブル内のすべての行を削除しようとしています。私は以下を試した:

DELETE FROM myTable 
WHERE EXISTS(
       SELECT * 
       FROM myTable 
       WHERE (Time1 IS NULL OR Time1 = 0) 
       AND (Time2 IS NULL OR Time2 = 0) 
       AND (Time3 IS NULL OR Time3 = 0) 
      ) 

ありがたいことに私はすべてのデータを一掃したので、データベースのテスト版で作業しています。どんな援助も本当に感謝しています。

+0

正しいアプローチについては、以下の回答のいずれかを参照してください。あなたが書いたのは、すべてのデータを削除した理由は、exist内のステートメントがレコードを返すたびにExistsがtrueになることです。 –

答えて

3

あなたが望むのはちょうどいいです。

DELETE myTable 
WHERE 
    (Time1 IS NULL OR Time1 = 0) 
    AND (Time2 IS NULL OR Time2 = 0) 
    AND (Time3 IS NULL OR Time3 = 0) 
+0

ご協力いただきありがとうございました。 – Kathy

1

EXISTSは(FROMあるとして - それはDELETEのために必要とされていない)不必要である:

DELETE myTable 
WHERE ((Time1 IS NULL OR Time1 = 0) 
    AND (Time2 IS NULL OR Time2 = 0) 
    AND (Time3 IS NULL OR Time3 = 0)) 
+0

すぐにお返事ありがとうございます! – Kathy

1

は、代わりにこれを試してください:あなたの

DELETE 
FROM myTable 
WHERE 
    (Time1 IS NULL OR Time1 = 0) AND 
    (Time2 IS NULL OR Time2 = 0) AND 
    (Time3 IS NULL OR Time3 = 0) 

理由すべてレコードが削除されるのは、3つの列すべてに対してNULLまたは0を持つ単一のレコードが存在する限り、EXISTSの結果が真であるためです。削除するレコードを特定しないDELETE文のあなたのWHERE句ので、それは基本的に、クエリは次のようにフォーマットする必要がありますDELETE FROM myTable WHERE 1=1

14

と同じである:

DELETE 
FROM myTable 
WHERE (Time1 IS NULL OR Time1 = 0) 
AND (Time2 IS NULL OR Time2 = 0) 
AND (Time3 IS NULL OR Time3 = 0) 

DELETE と思いをしています です。SELECTステートメントを作成してから変更することをお勧めします。

SELECT * --If this returns the correct records, simply change to DELETE 
FROM myTable 
WHERE (Time1 IS NULL OR Time1 = 0) 
AND (Time2 IS NULL OR Time2 = 0) 
AND (Time3 IS NULL OR Time3 = 0) 
+3

どのレコードが影響を受けているかを見るためにselectを最初に実行せずに削除を実行しないでください。また、影響を受けるレコードの数がわかるまでコミットを実行せずにトランザクションに入れてください。 – HLGEM

+0

ありがとうございました!それは素晴らしいヒントです、私は間違いなくこれから行います。 – Kathy

+2

+1は「最初に選択して開始」と言います。 MyISAMテーブル(ここではロールバックなし)で、あまりにも多くのbloopersが最初に選択するか、少なくとも最初にWHERE句で開始し、次にUPDATE/DELETEテーブル名を入力するよう教えてくれました。 – Ronnis

0
DELETE myTable WHERE 
(ISNULL(Time1,0) = 0) AND (ISNULL(Time2,0) = 0) AND (ISNULL(Time3,0) = 0) 
関連する問題