在SQL SERVER中从CTE中删除行

问题描述:

我有一个CTE,它是一个表上的select语句。现在,如果我从CTE删除1行,它是否会从我的基表中删除该行?在SQL SERVER中从CTE中删除行

如果我有临时表而不是CTE,那么情况也是如此吗?

检查DELETE statement documentation,,可以使用CTE从中删除,它会影响底层表。对于UPDATE语句也是如此......

如果我有一个临时表而不是CTE,那么情况也是如此吗?

不,从临时表中删除只会影响临时表 - 不存在与数据来自的表的连接,临时表是独立对象。

+0

在这种情况下,CTE与临时表有什么不同? – satyajit 2011-05-15 18:20:20

+2

@satyajit:临时表是一个表(可以有不同的作用域:本地,全局),它将数据存储在TEMPDB(而不是创建的数据库)中。 CTE是一个派生的表/内联视图,它只存在于其声明的查询范围内 - 使用当前数据库中的资源。 – 2011-05-15 18:26:17

您可以将CTE看作子查询,它下面没有临时表。
因此,如果您针对CTE运行删除语句,您将从表中删除行。当然,如果SQL可以推断哪个表在CTE上进行上/删除。否则,你会看到一个错误。

如果使用临时表,并且从中删除行,那么源表将不会受到影响,因为临时表和原始表没有任何关联。

+0

所以,说CTE作为一个临时视图 – satyajit 2011-05-15 18:19:26

+0

@satyajit会是正确的 - 你可以这么说。它不会导致创建任何数据库对象。相反,临时表将导致在tempdb中创建一个表,并将数据从源表中物理复制到表中。 – 2011-05-15 18:23:16

如果你有一个子查询,说连接多个表,并且你需要在多个地方使用它,那么cte和temp表都可以使用。如果你想要删除基于子查询条件的记录,那么cte就是要走的路。有时你可以简单地使用delete语句而不需要cte,因为它是一个删除语句,只有满足查询条件的行才会被删除,即使有多个条件用于过滤。