2010-07-17 57 views
5

这应该是一个直截了当的问题,但我还没有找到明确的答案。有谁知道如何使用单个查询从SQL Server 2005中的单个表中删除多行?我想知道它是否可能恰恰与插入多行相反,使用UNION ALL方法。这项工作如何? :用单个查询删除多行

DELETE FROM Table (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 
etc... 

编辑:我应该指出,这是我试图从记录中删除一个链接表。没有主键,任何列的值都可能重复。所以我需要确保在删除记录之前,两列都包含相同记录的某个值。

回答

9

你可以试试这个:

DELETE FROM YourTable 
WHERE (Name = 'Name1' AND Location = 'Location1') 
OR (Name = 'Name2' AND Location = 'Location2') 
OR (Name = 'Name3' AND Location = 'Location3') 
+0

如果您想在特定日期之前删除集合,那么where子句的范围可能是合适的。 – 2015-07-08 21:50:34

1
DELETE FROM T 
FROM YourTable T 
INNER JOIN (
SELECT 'Name1' AS Name, 'Location1' AS Location 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 
) T2 
ON T2.Name = T.Name 
AND T2.Location = T.Location 
+0

'FROM '在该链接中暗示JOIN是允许的。我相信他们是我一直使用他们很多次的。 :) – 2010-07-17 18:35:15

+1

刚刚尝试与MSSQL 2005,它工作正常OMG小马。 – 2010-07-17 18:37:26

2

使用CTE为我工作 - 比使用OR和括号容易得多:

WITH del AS (
    SELECT 'Name1' AS nam, 'Location1' AS loc 
    UNION ALL 
    SELECT 'Name2', 'Location2' 
    UNION ALL 
    SELECT 'Name3', 'Location3') 
DELETE FROM CLASSES 
WHERE EXISTS(SELECT NULL 
       FROM del d 
       WHERE d.name = name 
       AND d.loc = location) 

你不能定义一个表别名在删除语句中的表;任何没有表别名的列引用都可以假定为唯一没有表的列表,但它也取决于范围。