我在Oracle SQL中有一个表,其中的id按递增顺序排列,但由于编辑而导致ID存在空白,例如: ids目前类似于
我想通过遍历表格中的每一行来修复这些差距并更新它们以便没有间隙。最好的方法是什么?
答案 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