基于不满足单一条件的客户从SQL Server中删除所有客户的最快方法是什么

Mar*_*son 7 t-sql sql-server sql-server-2008

让我举例解释一下.请考虑下表:

Customer Id | Food
------------+---------
1           | Pizza       
1           | Burger   
1           | Hot Dog  
2           | Milkshake       
2           | Burger   
3           | Pizza  
Run Code Online (Sandbox Code Playgroud)

我想删除那些从未订购过Pizza的客户的所有记录.所以,我应该留下这个(客户#2删除):

Customer Id | Food
------------+---------
1           | Pizza       
1           | Burger   
1           | Hot Dog  
3           | Pizza  
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*ter 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'
);
Run Code Online (Sandbox Code Playgroud)

演示

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

  • 谢谢蒂姆.http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join的链接非常有用. (2认同)