删除INTERSECT

Niz*_*zam 6 sql sql-server intersect sql-server-2012 sql-delete

我有两个表,列数相同,没有主键(我知道,这不是我的错).现在我需要删除表B中存在的表A中的所有行(它们相等,每个行有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
Run Code Online (Sandbox Code Playgroud)

但是所有行都从表中删除了@A.

这让我想到了第二个问题:为什么命令DELETE @A FROM @B会从表中删除所有行@A

8kb*_*8kb 14

试试这个:

DELETE a 
FROM @A a
WHERE EXISTS (SELECT a.* INTERSECT SELECT * FROM @B)
Run Code Online (Sandbox Code Playgroud)

从@A中删除,对于@A中的每个记录,都有一个匹配,其中@A中的记录与@B中的记录相交.

这是基于Paul White的博客文章,使用INTERSECT进行不等式检查.

SQL小提琴