You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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);

逐点排查技巧

  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末尾多逗号、列缺失)。

  2. 检查DELETE语句的写法:多数数据库(比如SQL Server)不允许直接DELETE FROM OrderedRows,必须通过原表的唯一标识(比如ID)来定位删除的行,这也是容易踩坑的点。

  3. 注意符号格式:确保CTE的括号、逗号都是英文半角,有时候不小心输入中文符号也会触发奇怪的语法错误。

内容的提问来源于stack exchange,提问作者Randy Eckhardt

火山引擎 最新活动