Plsql 更新数据集中缺少的增量编号

Plsql 更新数据集中缺少的增量编号,plsql,sql-update,Plsql,Sql Update,在我的一个表中,我有一个名为“Priority”的列,它是一个从1开始的数字。有了新数据,下一个数字将添加到新记录中。 当我从中间删除一个数据时,优先级会有差距。我想运行一个plsql update语句,以便根据我之前的优先级顺序替换错误的数字 原始数据 Priority | user 1 | A 2 | B 3 | C 4 | D 然后我删除记录B Priority | user 1 | A 3 | C 4

在我的一个表中,我有一个名为“Priority”的列,它是一个从1开始的数字。有了新数据,下一个数字将添加到新记录中。 当我从中间删除一个数据时,优先级会有差距。我想运行一个plsql update语句,以便根据我之前的优先级顺序替换错误的数字

原始数据

Priority | user 
1        | A
2        | B
3        | C
4        | D
然后我删除记录B

Priority | user
1        | A
3        | C
4        | D
更新后应该是这样的

Priority | user
1        | A
2        | C
3        | D

您可以在不使用PL/SQL的情况下执行此操作:

create table demo
( priority  number, username varchar2(20) );

insert all
    into demo values (2, 'A')
    into demo values (4, 'B')
    into demo values (9, 'C')
    into demo values (10, 'D')
select * from dual;

merge into demo o
using ( select row_number() over (order by priority) as new_priority
             , rowid as row_id
        from   demo ) n
on (n.row_id = o.rowid)
when matched then update set o.priority = n.new_priority;

select * from demo;

  PRIORITY USERNAME
---------- --------------------
         1 A
         2 B
         3 C
         4 D

为什么?这似乎是为了没有有效的收益而进行的大量更新。对序列1,2,3和序列1,3,4进行排序将在完全相同的序列中产生完全相同的结果(至少对于所有其他列)。您的观点是正确的。但我在客户端中展示了这一点,我希望它成为用户理解它的一个连续数字。与许多人认为的相反,用户有巨大的能力理解这些事情。你会发现大多数人总是处理非顺序列表。但是如果你必须依次考虑创建一个视图,则显示顺序值(第一,第二,第三…),但下表有下层基数(1,3,4)。