2011-02-10 39 views
3

我是一个DB新手,并且正在为此而挣扎。我有以下几列现有表:SQL服务器 - 删除多列有空值或零值的行

Showroom, Salesperson, Time1, Time2, Time3, Dte 

我想有null或在所有3分时间列零个值表中删除所有行。我尝试了以下方法:

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

见任何下文正确的方法的答案。你所写的删除所有数据的原因是Exists在存在的语句返回任何记录时是真的。 – 2011-02-10 21:36:12

回答

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 2011-02-10 21:44:14

1

EXISTS是多余的(因为是FROM - 它不需要DELETE S):

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 2011-02-10 21:43:39

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) 

的原因,所有的你记录被删除的原因是,只要存在单个记录对于所有三列都具有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报表 我想 it 总是最好先创建您的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 2011-02-10 21:40:09

0
DELETE myTable WHERE 
(ISNULL(Time1,0) = 0) AND (ISNULL(Time2,0) = 0) AND (ISNULL(Time3,0) = 0)