我有一个包含这些列的表
create table demo (
ID integer not null,
INDEX integer not null,
DATA varchar2(10)
)
示例数据:
ID INDEX DATA
1 1 A
1 3 B
2 1 C
2 1 D
2 5 E
我想:
ID INDEX DATA
1 1 A
1 2 B -- 3 -> 2
2 1 C or D -- 1 -> 1 or 2
2 2 D or C -- 1 -> 2 or 1
2 3 E -- 5 -> 3 (closing the gap)
有没有办法使用单个SQL更新为每个ID重新编号INDEX?请注意,应保留项目的顺序(即项目“E”仍应在项目“C”和“D”之后,但“C”和“D”的顺序并不重要。
目标是能够在ID和INDEX上创建主键。
如果重要的话,我使用的是Oracle 10g。
答案 0 :(得分:2)
MERGE
INTO demo d
USING (
SELECT rowid AS rid, ROW_NUMBER() OVER (PARTITION BY id ORDER BY index) AS rn
FROM demo
) d2
ON (d.rowid = d2.rid)
WHEN MATCHED THEN
UPDATE
SET index = rn