我有一個表像下面表中的固定重複的行
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'
有人可以幫我解決這個問題
我有一個表像下面表中的固定重複的行
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'
有人可以幫我解決這個問題
您是否想刪除重複項?或者只是改變這些值,使它們不重複?
改變的值,用
更新producttotals 設定值= 'abc_1' 其中id = 2;
update producttotals set value ='abc_2' where id = 3;
找到重複行按id做 選擇ID,從producttotals值 基,值 具有計數()> 2;
使用遊標在表格上移動並嘗試在第二個臨時表格中插入每一行。如果碰撞(技術上與select
),您可以運行第二個查詢以獲取最大數量(如果有)附加到您的項目。
一旦您知道使用了最大數量(使用isnull
來覆蓋第一個副本的情況),只需在原始表格上運行更新並繼續使用掃描。
假設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
會產生SQL
第一CTE創建一個行號值以下
id value
----------- --------------------------------------------------
1 abc
2 abc_1
1 abc
3 abc_2
解釋。所以編號被重新啓動時,它看到一個新的價值
rn id value
-------------------- ----------- --------
1 1 abc
2 1 abc
3 2 abc
4 3 abc
第二CTE稱爲new_values將忽略assoicated用的1。因此RN-1和Rn 2得到去除RN任何標識,因爲它們共享相同的ID 。它還使用ROW_NUMBER()再次以確定NEW_VALUE
id value new_value
----------- ------ -------------
2 abc abc_1
3 abc abc_2
最後陳述時只是用新的值更新舊值
但是如果表abc_1已經存在,該怎麼辦?你可以讓id 2的值改爲abc_2 – kranglani
所以沒關係,如果行實際上是重複的(有兩個'1號,abc' rows),但是如果這些值是重複的,但ID是不同的,那麼你追加'_'並且ID減1? – CanSpice