2

Oracle SQLにテーブルがあり、そのIDは昇順で順番に並んでいますが、編集のためにIDにギャップがあります。たとえば、IDは現在次のようなものです。

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

テーブルの各行を調べて、ギャップがないように更新するだけで、これらのギャップを修正したいと思います。これを行うための最良の方法は何ですか?

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

これは、次のように1つの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

私は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;

IDが間違っている実際の列名に置き換えCOLUMN_NAMEてからこれを実行すると、正確に並べ替えられた列の値が表示されます。ありがとうございます。

于 2013-01-22T07:49:48.390 に答える