Sql server 如何更正大量重复记录
我正在尝试更正SQL Server中的大量重复记录,是否有一种方法可以将其作为批量更新来执行,而不是为每一行运行更新脚本 数据如下所示:Sql server 如何更正大量重复记录,sql-server,Sql Server,我正在尝试更正SQL Server中的大量重复记录,是否有一种方法可以将其作为批量更新来执行,而不是为每一行运行更新脚本 数据如下所示: client | voucher_no | sequence_no | id -------+------------+-------------+------ AA | 11111111 | 1 | 0001 AA | 11111111 | 1 | 0002 AA | 11111111
client | voucher_no | sequence_no | id
-------+------------+-------------+------
AA | 11111111 | 1 | 0001
AA | 11111111 | 1 | 0002
AA | 11111111 | 1 | 0003
AA | 11111112 | 13 | 0004
AA | 11111112 | 13 | 0004
AA | 11111113 | 28 | 0005
AA | 11111113 | 28 | 0006
AA | 11111114 | 17 | 0007
AA | 11111114 | 17 | 0008
AA | 11111115 | 23 | 0009
AA | 11111115 | 23 | 0010
我一直在试图找到一种一次性更新记录的方法,以便脚本的结果是:
client | voucher_no | sequence_no | id
-------+------------+-------------+------
AA | 11111111 | 1 | 0001
AA | 11111111 | 2 | 0002
AA | 11111111 | 3 | 0003
AA | 11111112 | 13 | 0004
AA | 11111112 | 14 | 0005
AA | 11111113 | 28 | 0006
AA | 11111113 | 29 | 0007
AA | 11111114 | 17 | 0008
AA | 11111114 | 18 | 0009
AA | 11111115 | 23 | 0010
AA | 11111115 | 24 | 0011
UPDATE table_a
SET sequence_no = (SELECT ROW_NUMBER() OVER (PARTITION BY sequence_no ORDER BY t.client, t.voucher_no, t.sequence_no ))
FROM table_a AS t
WHERE t.id IN (0002, 0003, 0005, 0007, 0009, 0011)
上面的操作对于列表中的第一个id很有效,但是它会用与第一个id相同的序列号更新其余的记录
因此,我最终得出以下结论:
client | voucher_no | sequence_no | id
-------+------------+-------------+------
AA | 11111111 | 2 | 0002
AA | 11111111 | 2 | 0003
AA | 11111112 | 2 | 0005
AA | 11111113 | 2 | 0007
AA | 11111114 | 2 | 0009
AA | 11111115 | 2 | 0011
如果将序列号更新为该客户机和凭证的现有序列号,则可能会导致进一步的问题
我还尝试将上述内容包装在一个游标中,认为查询没有机会使用下一个id号的正确序列号进行更新,但这也不起作用。我使用以下代码设法解决了这个问题: 声明@client VARCHAR2 声明@voucher\u no INT 声明@sequence\u无INT 声明@id INT 声明游标\u游标的结果 以T作为 按客户机、凭证号、序列号选择*、按分区计数* 来自表a 选择t.客户、t.凭证号、t.序列号、t.id 从T到T 其中t.cnt>1 和agrtid IN 0002、0003、0005、0007、0009、0011 按t.客户、t.凭证号、t.顺序号说明订购 打开光标并显示结果 从游标\u结果获取下一个到@client、@conceducer\u no、@sequence\u no、@id 而@@FETCH\u STATUS=0 开始 声明@new_sequence_no INT=从表_a中选择MAXsequence_no+1,其中client=@client和凭证_no=@concedure_no 更新表a 设置序列号=@新序列号, 上次更新=GETDATE, 用户id='USR' 其中id=@id 和client=@client 和凭证号=@凭证号 从游标\u结果获取下一个到@client、@conceducer\u no、@sequence\u no、@id 终止 关闭光标以显示结果 取消分配游标结果 虽然这可能不是解决这个问题的最佳方法,但使用光标可以让我在进入下一个记录之前,单步浏览记录并单独更新它们
以这种方式设置@new_sequence_no也确保了我当时打开的记录获得了正确的MAXsequence_no+1,而不是为第一条记录的所有重复项都提供了MAXsequence_no+1。请提供表架构。您实际上在对重复行做什么?你想更新所有的序列号吗?示例数据和预期结果在这里非常有用。请尝试按t.id分区,也可以为数据创建[SQLFiddle]www.SQLFiddle.com吗?抱歉,我将在一分钟内提供更多信息