2011-08-29 25 views
1

我有一個表像下面表中的固定重複的行

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' 

有人可以幫我解決這個問題

+2

所以沒關係,如果行實際上是重複的(有兩個'1號,abc' rows),但是如果這些值是重複的,但ID是不同的,那麼你追加'_'並且ID減1? – CanSpice

回答

0

您是否想刪除重複項?或者只是改變這些值,使它們不重複?

改變的值,用

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

update producttotals set value ='abc_2' where id = 3;

找到重複行按id做 選擇ID,從producttotals值 基,值 具有計數()> 2;

1

使用遊標在表格上移動並嘗試在第二個臨時表格中插入每一行。如果碰撞(技術上與select),您可以運行第二個查詢以獲取最大數量(如果有)附加到您的項目。

一旦您知道使用了最大數量(使用isnull來覆蓋第一個副本的情況),只需在原始表格上運行更新並繼續使用掃描。

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 

會產生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 

最後陳述時只是用新的值更新舊值

+0

但是如果表abc_1已經存在,該怎麼辦?你可以讓id 2的值改爲abc_2 – kranglani