SQL Server CTE删除了源表中数据,但为什么?

rn0zuynd  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(132)

我发现了这个奇怪的脚本,我不明白它。为什么这个cte删除我的表sampledata中的数据?我从来没有写过这样做的命令?有人能理解它吗?

DROP TABLE IF EXISTS #SampleData;
GO

CREATE TABLE #SampleData
(
IntegerValue INTEGER,
);
GO

INSERT INTO #SampleData VALUES
(1),(1),(2),(3),(3),(4);
GO

WITH cte_Duplicates AS
(
SELECT  ROW_NUMBER() OVER (PARTITION BY IntegerValue ORDER BY IntegerValue) AS Rnk
FROM    #SampleData
)
DELETE FROM cte_Duplicates WHERE Rnk > 1
GO

试用:https://dbfiddle.uk/M63U8OYt

xa9qqrwz

xa9qqrwz1#

CTE仍会在其基础数据表上作业。
其目的是以更好的可读性形式呈现或操作数据,尤其是在编写复杂查询时。
其目的不是创建表的副本,因此在执行删除、更新或插入命令时不会更改表。
因此,你的命令

DELETE FROM cte_Duplicates WHERE Rnk > 1

从示例表中删除重复项。
如果要将更改应用于表的副本而不是表本身,则CTE是不够的。
在这种情况下,您需要一个临时表。
另请参阅此处CTE和临时表之间的差异:differences

相关问题