Sql 关于CTE和从表中物理删除记录

Sql 关于CTE和从表中物理删除记录,sql,Sql,对于删除重复记录,我在下面的堆栈溢出查询中找到了一个很好的方法。在这个查询中,我们是从“a”中删除记录,而不是从tblEmployee中删除记录。所以我的问题是,尽管我们没有任何unique或primary键,但重复记录是如何从物理表中物理删除的 WITH a as ( SELECT Firstname,ROW_NUMBER() OVER(PARTITION by Firstname, empID ORDER BY Firstname) AS duplicateRecCount

对于删除重复记录,我在下面的堆栈溢出查询中找到了一个很好的方法。在这个查询中,我们是从“a”中删除记录,而不是从
tblEmployee
中删除记录。所以我的问题是,尽管我们没有任何
unique
primary
键,但重复记录是如何从物理表中物理删除的

WITH a as (
    SELECT Firstname,ROW_NUMBER() OVER(PARTITION by Firstname, empID ORDER BY Firstname) 
    AS duplicateRecCount
    FROM dbo.tblEmployee
   )
    --Now Delete Duplicate Records
DELETE
FROM a
WHERE duplicateRecCount > 1

您似乎正在SQL Server中使用可更新的CTE。在这种情况下,CTE的作用与视图相同

视图是可更新的,因为它只引用一个表,并且没有聚合。因此,CTE的作用只是向表中添加列,这些表可以在
DELETE
语句中引用


中解释了可更新视图的条件。这些条件与您的CTE相同。

为了理解这一点,让我们考虑临时表和CTE之间的区别。 当我们使用临时表时,这个临时表将保存在Tempdb数据库中。因此,它只是表的一个副本

tblEmployee
。无论您对临时表做了什么更改,它都不会影响
tblEmployee

但是,当您使用cte时,它实际上指向同一个表本身。这就是为什么,如果您从cte中删除,它也会影响
tblEmployee

CTE只不过是一个一次性视图。

用您正在使用的数据库标记您的问题。