我有两个描述的表:
表1
A栏,B栏,C栏,D栏
表2
A栏,B栏,C栏,E栏,F栏
除了包含在其中的数据之外,表之间没有关系(表2是临时表)。我想删除表2中存在于表2中的行。但是,它必须基于三列的组合。例如,如果表2中有记录,其中列A,B和C都匹配,则删除表1中的记录。
答案 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为两者生成了完全相同的执行计划:
因此,请使用您更容易理解的内容。
答案 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])