7

让我举例说明。考虑下表:

Customer Id | Food
------------+---------
1           | Pizza       
1           | Burger   
1           | Hot Dog  
2           | Milkshake       
2           | Burger   
3           | Pizza  

我想删除从未订购过披萨的客户的所有记录。所以,我应该留下这个(客户#2已删除):

Customer Id | Food
------------+---------
1           | Pizza       
1           | Burger   
1           | Hot Dog  
3           | Pizza  

我知道我可以做到,NOT IN但表现很糟糕。

编写此查询以针对 SQL Server 中的 100,000 多条记录实现此目的的最高效方法是什么?

4

4 回答 4

9

一个简单的索引NOT EXISTS应该是有效的。

DELETE c1 FROM Customers c1
WHERE NOT EXISTS
(
    SELECT 1 FROM Customers  c2
    WHERE c1.[Customer Id] = c2.[Customer Id]
    AND c2.[Food] = 'Pizza'
);

演示

在 上创建索引[Customer Id]和非聚集索引Food

于 2013-07-25T13:38:18.723 回答
4

怎么样NOT EXISTS

DELETE  a
FROM    table1 a
WHERE   NOT EXISTS
        (
            SELECT  1
            FROM    table1 b
            WHERE   a.customerID = b.customerID AND
                    b.Food = 'Pizza'
        )
于 2013-07-25T13:38:14.217 回答
0

尝试

delete t from t 
left join (select distinct [Customer Id] from t where Food='Pizza') t2
on t.[Customer Id]=t2.[Customer Id]
where t2.[Customer Id] is null

SQLFiddle 演示

于 2013-07-25T13:39:09.683 回答
0
  • 如果表很大,请尝试批量删除。或者
  • 将不需要删除的记录移到临时表中。截断主表,然后将其余记录从临时表中移到主表中。
于 2013-07-25T13:50:14.113 回答