将重复行更改为唯一值

时间:2011-09-03 05:55:39

标签: sql-server-2008

我有一个表格(FORM),其中包含以下列:

Serialno

424

536700045

345293885

424

466758884

424

424

244002678

我的目标是将424的重复行更改为424+(唯一的6位数字),但下面的查询最终将所有出现的424更改为424748793.

我需要让查询为每一行生成一个唯一值,副本为424,不包括第一个424。

感谢。

declare @count int

declare @num varchar (9)

declare @id varchar (9)

dcelare @generic varchar(9)

set @id = RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS varchar(6)), 6)

set @num= '424'

set @generic = @id+@num

select @count= COUNT(serialno) from FORM 

where  serialno = '424'

while @count <> 1

begin

update FORM SET  Serialno = @generic WHERE serialno = '424'

set @count = @count-1

 end

2 个答案:

答案 0 :(得分:2)

如果您有任何其他主键列,则可以根据所有记录唯一的主键值更新数据。如果您没有任何其他主键列,那么您可以使用如下所示的临时表和row_number函数来执行此操作:

SELECT Col1, Col2, Serialno,ROW_NUMBER() OVER(ORDER BY Serialno) AS RowNo INTO #TempTable FROM FormTable 

UPDATE #TempTable 
SET Serialno = Serialno + RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS varchar(6)), 6)
WHERE RowNo <> 1

DELETE FROM TestTable WHERE Serialno = '424'

INSERT INTO TestTable 
SELECT Col1,Col2 Serialno FROM #TempTable

DROP TABLE #TempTable 

答案 1 :(得分:1)

要重现您当前的逻辑,您只需要

UPDATE FORM 
SET  Serialno = '424' +
    RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS VARCHAR(6)), 6) 
WHERE serialno = '424'

当然,这并不能保证所有新生成的值都是唯一的,或者它们不会与表中任何预先存在的值冲突。

如果您的表格中没有424xxxxxx,您可以按如下方式分配顺序序列号。

;WITH CTE AS
(
SELECT *, 
       ROW_NUMBER() OVER (ORDER BY $/0) AS RN
FROM FORM
WHERE serialno = '424'
)
UPDATE CTE 
SET  Serialno = '424' + RIGHT('000000' + CAST(RN AS VARCHAR(6)), 6)