Oracle SQL - oracle sql中的更新ID按顺序排列

时间:2013-01-21 15:28:18

标签: sql oracle

我在Oracle SQL中有一个表,其中的id按递增顺序排列,但由于编辑而导致ID存在空白,例如: ids目前类似于

  • 22
  • 23
  • 24
  • 32
  • 33
  • 44
  • ...等

我想通过遍历表格中的每一行来修复这些差距并更新它们以便没有间隙。最好的方法是什么?

4 个答案:

答案 0 :(得分:3)

我认为以下内容适用于Oracle:

update (select t.*, row_number() over (order by id) as newid) toupdate
    set id = newid

上述答案很久以前就被接受了。它不起作用。我认为答案应该有适当的代码,所以:

merge into t dest using
       (select t.*, row_number() over (order by id) as newid from t) src
       on (dest.rowid = src.rowid)
   when matched then update set id = newid;

答案 1 :(得分:2)

您可以使用单个SQL语句执行此操作,如下所示:

create table t as
  select rownum * 2 id
  from   dual 
  connect by level <= 10;

update t set id = (
  with tab as (
    select id, rownum r 
    from   (select id from t order by id)
  ) 
  select r from tab where t.id = tab.id
);

select * from t;

        ID
----------
         1 
         2 
         3 
         4 
         5 
         6 
         7 
         8 
         9 
        10 

这将导致对其中的每一行进行t的完整扫描,因此如果t为“大”,则会非常慢。正如评论者所说,在做这件事之前要仔细考虑;有更好的方法来解决这个“问题”。

答案 2 :(得分:2)

使用这个:

update mytable set id = ROWNUM;

答案 3 :(得分:0)

我认为U应该执行此代码

DECLARE
   CURSOR A
   IS
      SELECT ROWID DD
        FROM YOUR_TABLE;
   B   NUMBER;
BEGIN
   B := 1;
   FOR I IN A
   LOOP
      UPDATE YOUR_TABLE
         SET COLUMN_NAME = B
       WHERE ROWID = I.DD;
      B := B + 1;
   END LOOP;
END;

只需将COLUMN_NAME替换为具有错误ID的实际列名,然后执行此操作并查看已排序的列值accuratley.Thanks