Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL或PL/SQL重新索引列_Sql_Oracle_Plsql - Fatal编程技术网

使用SQL或PL/SQL重新索引列

使用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号加上一个名为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,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链接回原始。。。我经常用这个技巧绕过那个错误。