使用CTE

时间:2018-07-19 11:11:48

标签: sql sql-server tsql

我正在尝试在表中查找重复记录。
我的目标是先检查结果,然后再删除双打。

所以想法是使用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)

4 个答案:

答案 0 :(得分:3)

您的删除将如下所示:

DELETE
FROM CTE
WHERE RN > 1;

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

SELECT *
FROM CTE
WHERE RN > 1;

答案 1 :(得分:2)

您需要使用expression语句至少定义一个columnSELECT

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

您可以将记录删除为:

DELETE C
FROM CTE C
WHERE RN > 1;

答案 2 :(得分:1)

在关键字中使用*之前,或在选择查询中使用列名

  ;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

答案 3 :(得分:0)

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

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

ELSE
BEGIN
SELECT * FROM (SELECT Columns FROM TableName) AS T1