Oracle SQLにテーブルがあり、そのIDは昇順で順番に並んでいますが、編集のためにIDにギャップがあります。たとえば、IDは現在次のようなものです。
- 22
- 23
- 24
- 32
- 33
- 44
- ...等
テーブルの各行を調べて、ギャップがないように更新するだけで、これらのギャップを修正したいと思います。これを行うための最良の方法は何ですか?
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つの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
コメント提供者が言ったように、これを行う前に非常に慎重に考えてください。この「問題」を解決するためのより良い方法があります。
これを使用してください:
update mytable set id = ROWNUM;
私は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
てからこれを実行すると、正確に並べ替えられた列の値が表示されます。ありがとうございます。