我有一张如下表格
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'
有人可以帮我解决这个问题吗?
答案 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
最终语句只是使用新值
更新旧值