SQL Server 2017中用CTE查找重复项报错求助:语法错误
排查CTE删除重复行的语法错误问题
嘿,我来帮你搞定这个')'附近的语法错误!这种报错通常是CTE定义或者后续DELETE语句的格式出了问题,咱们一步步拆解排查:
常见错误原因&修正方案
首先看你给出的代码片段,PARTITION BY Carrier, ...这里明显没写完分组列,这大概率是报错的根源之一——数据库会认为你没闭合PARTITION BY的括号。另外,直接删除CTE行的写法在很多数据库里也不支持,得通过原表主键关联删除。
给你一个完整的可参考修正版本:
WITH OrderedRows AS ( SELECT ID, Carrier, ClaimDate, EmpID, ClaimNumber, LossNumber, TaskID, TaskType, TaskGroup, LetterDetails, Outlier, BeginTime, EndTime, TemplateUsed, Increment, -- 给行号起明确别名,方便后续筛选 ROW_NUMBER() OVER ( PARTITION BY Carrier, ClaimDate, EmpID, ClaimNumber, LossNumber, TaskID -- 补全所有用来判断重复的字段 ORDER BY ID -- 指定保留哪一行,比如保留ID最小的原始行,可按需修改 ) AS RowOrder ) -- 通过原表ID关联删除重复行 DELETE FROM YourActualTableName -- 替换成你的真实表名 WHERE ID IN (SELECT ID FROM OrderedRows WHERE RowOrder > 1);
逐点排查技巧
先验证CTE的SELECT部分:把CTE里的SELECT单独拿出来运行,比如:
SELECT ID, Carrier, -- ...其他所有列 ROW_NUMBER() OVER ( PARTITION BY Carrier, ClaimDate, EmpID -- 确保这里列全、没有多余逗号 ORDER BY ID ) AS RowOrder FROM YourActualTableName;如果这部分报错,先修好CTE内部的语法问题(比如列名拼写错、PARTITION BY末尾多逗号、列缺失)。
检查DELETE语句的写法:多数数据库(比如SQL Server)不允许直接
DELETE FROM OrderedRows,必须通过原表的唯一标识(比如ID)来定位删除的行,这也是容易踩坑的点。注意符号格式:确保CTE的括号、逗号都是英文半角,有时候不小心输入中文符号也会触发奇怪的语法错误。
内容的提问来源于stack exchange,提问作者Randy Eckhardt




