sql - 相交删除

标签 sql sql-server sql-server-2012 sql-delete intersect

我有两个表,它们的列数相同,但没有主键(我知道,这不是我的错)。现在我需要删除表 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 Fiddle

关于sql - 相交删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014126/

相关文章:

SQL 计算日历年内的日期段

SQL Server Management Studio - 在多个数据库中按名称查找存储过程

sql - 将 WHERE 与 SUM 函数 SQL 结合使用

sql - 多次更新替换以使代码看起来正确

sql-server - 聚集索引默认排序顺序

sql-server - 在 Service Broker 中向服务添加契约(Contract)后

MySQL 插入值和一些要从其他表中选择的值

sql - 在一个 SQL 查询中加入两个 COUNT()

sql - 需要帮助从 SQL 查询中创建一个函数

sql - SQL Server 对 JSON 的支持是否可以替代 MongoDB 等 NoSql 解决方案?