我正在使用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作为复合主键设置,因为我有双倍。
所以现在我的桌子上没有主键。
答案 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