修复表中许多项目组的编号

时间:2009-08-12 14:34:00

标签: oracle oracle10g

我有一个包含这些列的表

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。

1 个答案:

答案 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