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

我正在尝试更正SQL Server中的大量重复记录,是否有一种方法可以将其作为批量更新来执行,而不是为每一行运行更新脚本

数据如下所示:

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吗?抱歉,我将在一分钟内提供更多信息