代码之家  ›  专栏  ›  技术社区  ›  GuidoG

使用CTE时语法不正确

  •  0
  • GuidoG  · 技术社区  · 7 年前

    我想在一张桌子上找到两张唱片。
    我的目标是先检查结果,如果确定,然后删除双打。

    所以我们的想法是用CTE找到所有的双打,并去掉原始记录

    WITH CTE AS(
       SELECT ChassisID, FileName, OpdrachtID,
          RN = ROW_NUMBER() OVER (PARTITION BY ChassisID, FileName, OpdrachtID ORDER BY ChassisID)
       FROM dbo.tblChassisVMac
    )
    SELECT FROM CTE 
    WHERE RN > 1
    

    在检查是否正确之后,我想替换 SELECT DELETE

    但我一直有个错误:

    关键字“from”附近的语法不正确

    我可能遗漏了一些琐碎的东西,但我就是看不见

    SQL Server 2014(SP2)

    3 回复  |  直到 7 年前
        1
  •  3
  •   Tim Biegeleisen    7 年前

    您的删除将如下所示:

    DELETE
    FROM CTE
    WHERE RN > 1;
    

    一个 DELETE 语句通常不指定列,因为它以删除整个记录为目标。另一方面,一个 SELECT 查询需要指定列因此,以下选择将起作用:

    SELECT *
    FROM CTE
    WHERE RN > 1;
    
        2
  •  2
  •   Yogesh Sharma    7 年前

    你至少需要定义一个 expression column 具有 SELECT 陈述

    SELECT col1, . . .
    FROM CTE 
    WHERE RN > 1
    

    您可以删除以下记录:

    DELETE C
    FROM CTE C
    WHERE RN > 1;
    
        3
  •  1
  •   Ravi Bharati Mathapati    7 年前

    在from关键字前使用*或在select查询中使用列名

      ;WITH CTE AS(
           SELECT ChassisID, FileName, OpdrachtID,
              RN = ROW_NUMBER() OVER (PARTITION BY ChassisID, FileName, OpdrachtID ORDER BY ChassisID)
           FROM dbo.tblChassisVMac
        )
        SELECT *
        FROM CTE 
        WHERE RN > 1
    
        4
  •  0
  •   Mohammad Reza Shahrestani    6 年前

    使用CTE时,它必须是批处理中的第一个语句。 尝试使用派生表,如下所示

    IF @Block <> 'All'
    BEGIN
    SELECT * FROM (SELECT Columns FROM TableName) AS T
    END
    
    ELSE
    BEGIN
    SELECT * FROM (SELECT Columns FROM TableName) AS T1