我有两个表,它们的列数相同,但没有主键(我知道,这不是我的错)。现在我需要删除表 A 中存在于表 B 中的所有行(它们是相等的,每行有 30 列)。
我想到的最直接的方法是进行INNER JOIN
并解决我的问题。但是,为所有列写入条件(担心 NULL
)并不优雅(可能是因为我的表也不优雅)。
我想使用INTERSECT
。我不知道该怎么做?这是我的第一个问题:
我尝试过(SQL Fiddle):
declare @A table (value int, username varchar(20))
declare @B table (value int, username varchar(20))
insert into @A values (1, 'User 1'), (2, 'User 2'), (3, 'User 3'), (4, 'User 4')
insert into @B values (2, 'User 2'), (4, 'User 4'), (5, 'User 5')
DELETE @A
FROM (SELECT * FROM @A INTERSECT SELECT * from @B) A
但是所有行都已从表 @A
中删除。
这让我想到了第二个问题:为什么命令 DELETE @A FROM @B
会删除表 @A
中的所有行?
最佳答案
试试这个:
DELETE a
FROM @A a
WHERE EXISTS (SELECT a.* INTERSECT SELECT * FROM @B)
从@A中删除,对于@A中的每条记录,@A中的记录与@B中的记录相交。
这是基于 Paul White 的 blog post使用 INTERSECT 进行不等式检查。
关于sql - 相交删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014126/