我在 Oracle SQL 中有一个表,其 id 以递增的顺序排列,但由于编辑,id 中存在间隙,例如,id 目前类似于
- 22
- 23
- 24
- 32
- 33
- 44
- ...ETC
我想通过遍历表中的每一行并更新它们来修复这些差距,这样就没有差距了。最好的方法是什么?
我认为以下内容适用于 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;
您可以使用单个 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;
我认为你应该执行这段代码
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 的实际列名替换,然后执行此操作并查看准确排序的列值。谢谢