首页 > 解决方案 > SQL Server:从表中删除

问题描述

我一直在 SQL Server 中遇到这种DELETE FROM FROM语法,并且不得不提醒自己它的作用。

DELETE FROM tbl
FROM #tbl
  INNER JOIN tbl ON fk = pk AND DATEDIFF(day, #tbl.date, tbl.Date) = 0

编辑:为了使大多数评论和建议的答案有意义,原始问题有以下查询:

DELETE FROM tbl
FROM tbl2

标签: sql-servertsql

解决方案


据我了解,您将使用这样的结构您可以根据 from 查询的结果限制从第一个表中删除哪些行。但要做到这一点,您需要在两者之间建立相关性。

在您的示例中,没有相关性,这实际上是一种交叉连接,这意味着“对于 tbl2 中的每一行,删除 tbl1 中的每一行”。换句话说,它将删除第一个表中的每一行。

这是一个例子:

declare @t1 table(A int, B int)
insert @t1 values (15, 9)
,(30, 10)
,(60, 11)
,(70, 12)
,(80, 13)
,(90, 15)

declare @t2 table(A int, B int)
insert @t2 values (15, 9)
,(30, 10)
,(60, 11)

delete from @t1 from @t2

结果是一个空的@t1。

另一方面,这将只删除匹配的行:

delete from @t1 from @t2 t2 join @t1 t1 on t1.A=t2.A

推荐阅读