使用SQL或PL/SQL重新索引列
我有几个表,它们使用一个ID号加上一个名为xsequence的列,这两个列都是主键。目前,我有一组数据如下所示:使用SQL或PL/SQL重新索引列,sql,oracle,plsql,Sql,Oracle,Plsql,我有几个表,它们使用一个ID号加上一个名为xsequence的列,这两个列都是主键。目前,我有一组数据如下所示: ID_NUMBER,XSEQUENCE 001,2 001,5 001,8 002,1 002,6 select id_number, row_number() over (partition by id_number order by xsequence) new_xsequence from yourtable 我需要的是: ID_NUMBER,XSEQUE
ID_NUMBER,XSEQUENCE
001,2
001,5
001,8
002,1
002,6
select id_number,
row_number() over (partition by id_number order by xsequence) new_xsequence
from yourtable
我需要的是:
ID_NUMBER,XSEQUENCE
001,1
001,2
001,3
002,1
002,2
开始这项工作的最佳方式是什么?每次尝试时,我都会旋转车轮。尝试以下方法:
ID_NUMBER,XSEQUENCE
001,2
001,5
001,8
002,1
002,6
select id_number,
row_number() over (partition by id_number order by xsequence) new_xsequence
from yourtable
这是一个分析函数,对于这类事情来说非常方便。使用Partition关键字-在每个id\u编号处重置计数器。所以1,2,3。。然后再次开始1,2,3。。。等等
分析函数中的Partition关键字的行为与groupby关键字非常相似
[编辑]
为了更新原始表,我实际上更喜欢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
[编辑]您的意思是它是使用两列的复合主键?大概您也需要更新相关的外键值。但你真的需要这样做吗?实际价值重要吗?或者从另一个角度来看,您是否需要实际更新该值,或者一个使序列看起来连续的查询/视图是否足够?我们认为它们需要按顺序排列,因为它们会干扰我们尝试执行的更新。听起来您可能试图解决错误的问题。特别是如果未来的变化会再次引入缺口。也许你可以解释一下你最初的问题,以及为什么你认为让它们相邻会有帮助;当然,这可能是一个完全不同的问题。我认为你是对的。我们觉得解决方案是去掉复合主键,但我们使用的产品是另一个供应商提供的产品。我们被告知要避免更改交付的代码。我同意Alex的观点。即使重新排序解决了您的问题,它充其量也只是一个临时解决方案。我无法想象有一个复合PK是如何把更新搞得一团糟的。我很想看到更多的细节。那太完美了!现在,我如何将其合并到update语句中?更新select id_number,按id_number order by XSENCENCE new_XSENCENCE从您的表集合XSENCENCE=new_XSENCENCE的分区上的行数;那不行。我收到以下错误:[错误]执行14:35:ORA-38104:ON子句中引用的列无法更新:BASE。XSEQUENCE@jacob:哦,好的,如果是这样,请尝试我的最新编辑。使用rowids链接回原始。。。我经常用这个技巧绕过那个错误。