我正在尝试将复合主键添加到我称为“ Stock”的表中。由于我想要的主键中有重复项,因此不允许我添加主键,因此有没有办法在单个查询中删除每个重复项中的1个,而不必手动进行?
我使用此查询找到了所有重复项(总共67行重复项):
SELECT Count(*), STK, yr, mn, dy
FROM Stock
GROUP BY STK, yr, mn, dy
HAVING count(*) > 1
ORDER BY STK ASC;
答案 0 :(得分:1)
您可以使用CTE来获取ROW_NUMBER-任何重复项的ROW_NUMBER都将大于1(请在数据库的测试副本(而非生产版本)中进行尝试):
; WITH AllRecords
AS (
SELECT STK, yr, mn, dy, RowNum = ROW_NUMBER()OVER(PARTITION BY STK, yr, mn, dy ORDER BY STK)
FROM Stock
)
DELETE s
FROM Stock s
JOIN [AllRecords] a
ON s.STK = a.STK
AND s.yr = a.yr
AND s.mn = a.mn
AND s.dy = a.dy
WHERE a.[RowNum] > 1;
答案 1 :(得分:0)
我肯定有一个更优雅的解决方案,但是对于这样的一次性数据修复,我通常Select
将重复记录的唯一副本Delete
从临时表中删除。生产表,然后Insert
临时表回到生产表。快速,肮脏,让我继续生活。