使用多个主键在SQL上删除double

时间:2013-03-18 10:52:23

标签: sql sql-server-2008-r2

我正在使用SQL 2008 R2。我有5个复合主键

(NOID ,CODE_CLIENT,CODE_DEST,DATE_CLOTURE,DATE_CLOTUR_REEL) 

在我的桌子上。

我尝试使用以下语法删除double:

DELETE
FROM [LETTRE_VOIT_FINAL]
WHERE EXISTS
    (SELECT NOID ,
            CODE_CLIENT,
            CODE_DEST,
            DATE_CLOTURE,
            DATE_CLOTUR_REEL
     FROM LETTRE_VOIT_FINAL
     GROUP BY NOID ,
              CODE_CLIENT,
              CODE_DEST,
              DATE_CLOTURE,
              DATE_CLOTUR_REEL HAVING count(*) > 1)

它删除了所有条目,幸运的是我做了备份。

在我刚刚拥有4个复合主键之前,我添加了最后一个DATE_CLOTUR_REEL。因为主键的值不能为null,所以我将值getdate()放入此键中。因为我不能将所有5作为复合主键设置,因为我有双倍。 所以现在我的桌子上没有主键。

2 个答案:

答案 0 :(得分:1)

删除表格的副本:

;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY NOID ,CODE_CLIENT,CODE_DEST,DATE_CLOTURE,DATE_CLOTUR_REEL
                                       ORDER BY ( SELECT 0)) RN
         FROM   LETTRE_VOIT_FINAL)
DELETE FROM cte
WHERE  RN > 1

答案 1 :(得分:0)

问题是exists语句中的子查询不以任何方式与“delete from”绑定。结果是存在任何双精度数会删除表中的所有记录。此外,我认为你搞砸了主键(由其他用户评论)。 无论如何,您可以使用CTE删除重复项:

WITH CTE (COl1,Col2, DuplicateCount)
AS
(
    SELECT COl1,Col2,
        ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount
    FROM DuplicateRcordTable
)

DELETE
FROM CTE
WHERE DuplicateCount > 1