如何使用CTE和ROW_NUMBER函数在SQL存储过程中巧妙删除重复数据?
- 内容介绍
- 相关推荐
本文共计730个文字,预计阅读时间需要3分钟。
直接删除重复数据,使用CTE和ROW_NUMBER()函数最稳妥——它能精确保留每组的第一条记录,且不依赖任何单一键。
为什么不能直接 DELETE 加 GROUP BY?
SQL Server(及多数主流数据库)不允许在 DELETE 语句中直接使用 GROUP BY 或聚合函数。硬写 DELETE FROM t GROUP BY col 会报错:Incorrect syntax near the keyword 'GROUP'。CTE 提供了一个可更新的“逻辑视图”,让 ROW_NUMBER() 的结果能被 DELETE 引用。
ROW_NUMBER() 必须配合 PARTITION BY 和 ORDER BY
只写 ROW_NUMBER() OVER () 没意义——它会给全表所有行统一编号(1 到 N),起不到“按重复组划分”的作用。
本文共计730个文字,预计阅读时间需要3分钟。
直接删除重复数据,使用CTE和ROW_NUMBER()函数最稳妥——它能精确保留每组的第一条记录,且不依赖任何单一键。
为什么不能直接 DELETE 加 GROUP BY?
SQL Server(及多数主流数据库)不允许在 DELETE 语句中直接使用 GROUP BY 或聚合函数。硬写 DELETE FROM t GROUP BY col 会报错:Incorrect syntax near the keyword 'GROUP'。CTE 提供了一个可更新的“逻辑视图”,让 ROW_NUMBER() 的结果能被 DELETE 引用。
ROW_NUMBER() 必须配合 PARTITION BY 和 ORDER BY
只写 ROW_NUMBER() OVER () 没意义——它会给全表所有行统一编号(1 到 N),起不到“按重复组划分”的作用。

