纠正SQL Server数据库中的重复记录
我有一个包含许多记录的表,其中有一个nic
列应具有唯一值。但它包含一些污垢,意味着那里有一些重复的值。纠正SQL Server数据库中的重复记录
像与
id = 567 has nic = '786-786'
也
id = 897 has nic = '786-786'.
我想写一个存储过程我应该在最后删除那些重复的和追加1像
id = 567 , nic= '786-786'
id = 788 , nic = '786-786-1'
id = 2344, nic = '786-786-2'
是用户有可能吗?
使用窗口功能/分析功能,如
Row_number() over (partition by Nic, order by ID)
SQL Fiddle 喜欢的东西...
UPDATE B
SET B.Nic = C.NewNic
FROM Foo B
INNER JOIN (SELECT ID, NIC + '-' + cast(Row_number()
over (partition by NIC order by ID) as varchar(20)) as newNic
FROM FOo) C
on C.ID = B.ID
这会给你
id = 567 , nic= '786-786-1'
id = 788 , nic = '786-786-2'
id = 2344, nic = '786-786-3'
你总是能做个案陈述和当行1,则不会显示再减去1,如果你要离开,没有一个-1
SQL Fiddle getting rid of the -1 for first record...
UPDATE B
SET B.Nic = Case WHEN C.RN = 1 then B.Nic Else B.Nic+ '-'+cast((RN-1) as varchar(20)) end
FROM Foo B
INNER JOIN (SELECT ID, NIC, cast(Row_number()
over (partition by NIC order by ID) as varchar(20)) as RN
FROM FOo) C
on C.ID = B.ID
的第一个结果造成:
ID NIC
567 786-786
897 786-786-1
和SQL Fiddle显示多个网卡
ID NIC
567 786-786
600 786-786-1
897 786-786-2
10 786-787
12 786-787-1
900 786-787-2
无法正常工作,在'Inner join'第2行和第3行'as'处出现语法错误。 –
提供了更新和工作的SQL小提琴。 – xQbert
for tsql
您可以通过简单的更新做到这一点,试试这个查询:
select id, nic, rank() over (partition by nic order by id)
from your_table as t1
where exists(select 1 from your_table where nic = t1.nic and id <> t1.id)
您可以构建更新查询,或返回更新的字符串作为这个选择的领域。阅读关于rank()
标签mysql ...你需要什么数据库引擎查询,MS SQL或MySQL? –
它是'MSSQL引擎'。 –