使用 SQL 或 PL/SQL 重新索引列
Re-indexing a column with either SQL or PL/SQL
我有几个表使用一个 ID 号加上一个名为 xsequence
的列,它们都是主键。目前,我有一堆数据如下所示:
ID_NUMBER,XSEQUENCE
001,2
001,5
001,8
002,1
002,6
我需要结束的是:
ID_NUMBER,XSEQUENCE
001,1
001,2
001,3
002,1
002,2
开始这项工作的最佳方式是什么?每次我尝试,我都只是在旋转我的轮子。
尝试这样的事情:
select id_number,
row_number() over (partition by id_number order by xsequence) new_xsequence
from yourtable
对于这类事情,这是一个非常方便的分析函数。使用 Partition 关键字 - "resets" 每个 id_number 处的计数器。 (所以 1,2,3 .. 然后再次开始 1,2,3 ... 等等)。
(解析函数中的Partition关键字与GROUP by关键字的行为非常相似)
[编辑]
要更新原始的 table,我实际上更喜欢 MERGE 语句 - 它的语法更简单,而且看起来更直观 ;))
MERGE INTO yourtable base
USING (
select rowid rid,
id_number,
row_number() over (partition by id_number order by xsequence) new_xsequence,
xsequence old_xsequence
from yourtable
) new
ON ( base.rowid = new.rid )
WHEN MATCHED THEN UPDATE
SET base.xsequence = new.new_xsequence
[编辑]
我有几个表使用一个 ID 号加上一个名为 xsequence
的列,它们都是主键。目前,我有一堆数据如下所示:
ID_NUMBER,XSEQUENCE
001,2
001,5
001,8
002,1
002,6
我需要结束的是:
ID_NUMBER,XSEQUENCE
001,1
001,2
001,3
002,1
002,2
开始这项工作的最佳方式是什么?每次我尝试,我都只是在旋转我的轮子。
尝试这样的事情:
select id_number,
row_number() over (partition by id_number order by xsequence) new_xsequence
from yourtable
对于这类事情,这是一个非常方便的分析函数。使用 Partition 关键字 - "resets" 每个 id_number 处的计数器。 (所以 1,2,3 .. 然后再次开始 1,2,3 ... 等等)。
(解析函数中的Partition关键字与GROUP by关键字的行为非常相似)
[编辑] 要更新原始的 table,我实际上更喜欢 MERGE 语句 - 它的语法更简单,而且看起来更直观 ;))
MERGE INTO yourtable base
USING (
select rowid rid,
id_number,
row_number() over (partition by id_number order by xsequence) new_xsequence,
xsequence old_xsequence
from yourtable
) new
ON ( base.rowid = new.rid )
WHEN MATCHED THEN UPDATE
SET base.xsequence = new.new_xsequence
[编辑]