修复表中的重复行

时间:2011-08-29 19:19:25

标签: sql sql-server duplicates

我有一张如下表格

DECLARE @ProductTotals TABLE 
(
  id int, 

  value nvarchar(50)
)

具有以下值

1, 'abc'
2, 'abc'
1, 'abc'
3, 'abc'

我想更新此表,以便它具有以下值

1, 'abc'
2, 'abc_1'
1, 'abc'
3, 'abc_2'

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

使用游标移动表并尝试在第二个临时表中插入每一行。如果发生碰撞(技术上与select),您可以运行第二个查询以获取附加到项目的最大数量(如果有)。

一旦您知道使用了哪个最大数量(使用isnull来涵盖第一个副本的情况),只需对原始表格进行更新并继续扫描。

答案 1 :(得分:0)

您是否希望删除重复项?或者只是更改值,使它们不重复?

更改值使用

更新producttotals 设定值='abc_1' 其中id = 2;

更新producttotals 设定值='abc_2' 其中id = 3;

找到重复的行做一个 选择id,value 来自producttotals 按ID,值分组 有count()> 2;

答案 2 :(得分:0)

假设SQL Server 2005或更高版本

DECLARE @ProductTotals TABLE 
(
  id int, 

  value nvarchar(50)
)
INSERT INTO @ProductTotals
VALUES (1, 'abc'),
        (2, 'abc'),
        (1, 'abc'),
        (3, 'abc')


;WITH CTE as 
(SELECT 
    ROW_NUMBER() OVER (Partition by value order by id) rn,
    id,
    value
FROM
    @ProductTotals),
new_values  as (
SELECT
    pt.id,
    pt.value,
    pt.value + '_' +  CAST( ROW_NUMBER() OVER (partition by pt.value order by pt.id) as varchar) new_value



FROM
    @ProductTotals pt
    INNER JOIN CTE
    ON pt.id = CTE.id
     and pt.value = CTE.value   
WHERE
    pt.id NOT IN (SELECT id FROM CTE WHERE rn = 1)) --remove any with the lowest ID for the value

UPDATE
    @ProductTotals 
SET
    pt.value = nv.new_value
FROM 
@ProductTotals pt 
inner join new_values nv
ON pt.id = nv.id and pt.value = nv.value

SELECT * FROM @ProductTotals 

将产生以下

id          value
----------- --------------------------------------------------
1           abc
2           abc_1
1           abc
3           abc_2

SQL的解释

第一个CTE创建一个行号Value。因此,只要看到新值

,编号就会重新启动
rn                   id          value
-------------------- ----------- --------
1                    1           abc
2                    1           abc
3                    2           abc
4                    3           abc

第二个名为new_values的CTE忽略任何与RN为1的ID。因此,rn 1和rn 2会被删除,因为它们共享相同的ID。它还使用ROW_NUMBER()来确定new_value的数字

id          value  new_value
----------- ------ -------------
2           abc    abc_1
3           abc    abc_2

最终语句只是使用新值

更新旧值
相关问题