使用另一个表中的多个标识列从表中删除

时间:2018-05-02 16:07:44

标签: sql-server

我有两个描述的表:

表1

A栏,B栏,C栏,D栏

表2

A栏,B栏,C栏,E栏,F栏

除了包含在其中的数据之外,表之间没有关系(表2是临时表)。我想删除表2中存在于表2中的行。但是,它必须基于三列的组合。例如,如果表2中有记录,其中列A,B和C都匹配,则删除表1中的记录。

3 个答案:

答案 0 :(得分:6)

您可能正在寻找INNER JOIN DELETE

DELETE a
FROM Table1 a
INNER JOIN Table2 b
ON a.ColumnA=b.ColumnA
AND a.ColumnB=b.ColumnB
AND a.ColumnC=b.ColumnC

(或者不管是什么关系。)

答案 1 :(得分:2)

我赞成Jiggles32的答案,因为它看起来完全符合您的要求(假设您认为列只有在匹配非null 值时才匹配),但认为值得指出您也可以使用以下语法:

delete a 
from dbo.Table1 a 
where exists
(
    select 1 
    from dbo.Table2 b 
    where
        a.ColumnA = b.ColumnA and
        a.ColumnB = b.ColumnB and
        a.ColumnC = b.ColumnC
);

EXISTS实现了一个半连接,它检查某些其他表中是否存在数据而不实际从中提取任何数据。有趣的是,当我运行Jiggles32的DELETE和上面的那个时,我发现SQL Server为两者生成了完全相同的执行计划:

enter image description here

因此,请使用您更容易理解的内容。

答案 2 :(得分:1)

DELETE FROM [Table 1] 
WHERE [Table 1].[Column A] IN 
    (SELECT [Table 1].[Column A] 
     FROM [Table 1] t1 
     INNER JOIN [Table 2] t2 ON 
        t1.[Column A] = t2.[Column A] AND 
        t1.[Column B] = t2.[Column B] AND 
        t1.[Column C] = t2.[Column C])