2

我在 Oracle SQL 中有一个表,其 id 以递增的顺序排列,但由于编辑,id 中存在间隙,例如,id 目前类似于

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

我想通过遍历表中的每一行并更新它们来修复这些差距,这样就没有差距了。最好的方法是什么?

4

4 回答 4

4

我认为以下内容适用于 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;
于 2013-01-21T15:32:54.897 回答
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正如评论者所说,在这样做之前要仔细考虑;有更好的方法来解决这个“问题”。

于 2013-01-22T11:52:06.480 回答
2

使用这个:

update mytable set id = ROWNUM;
于 2016-08-05T09:01:49.303 回答
0

我认为你应该执行这段代码

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 的实际列名替换,然后执行此操作并查看准确排序的列值。谢谢

于 2013-01-22T07:49:48.390 回答