Oracle更新查询以按顺序更新记录

时间:2016-08-05 12:38:54

标签: oracle oracle11g

我在Oracle SQL中有一个表,其中的id按递增顺序排列,但由于编辑而导致ID存在空白,例如: ids目前类似于

22 
23 
24 
32 
33 
44 
...etc

我检查了一个帖子,提供的解决方案如下:

update (select t.*, row_number() over (order by id) as newid) toupdate
    set id = newid

Solution Provided earlier.

现在我的查询: 1)我想" From子句"在上面的查询中缺少。

更新了查询:

update (select t.*, 
              row_number() over (order by emp_id) as newid 
       from employee t ) toupdate 
set emp_id = newid; 

2)当我运行上述查询时,它给出了错误"数据操作操作在此视图上不合法"。

任何人都可以解释上述解决方案如何在这里工作。任何人都可以发布完整更新查询。谢谢。

3 个答案:

答案 0 :(得分:1)

This solution您引用的同一问题显示了如何执行此操作:

update employee set emp_id = (
  with tab as (
    select emp_id, rownum r
    from   (select emp_id from employee order by emp_id)
  )
  select r from tab where employee.emp_id = tab.emp_id
);

有效。您无法更新包含row_number等分析函数的视图 - 请参阅Oracle 12C docs,查找"有关可更新视图的注释"。

答案 1 :(得分:1)

您可以使用merge,但您需要加入emp_id以外的其他内容,以便更新该列。如果没有其他唯一列,您可以使用rowid

merge into employee target
using (select rowid, row_number() over (order by emp_id) as emp_id from employee) source
on (source.rowid = target.rowid)
when matched then update set target.emp_id = source.emp_id;

答案 2 :(得分:0)

我认为这是最简单的方法:

  

更新mytable集ID = ROWNUM;

Oracle SQL - update ids in oracle sql to be in sequential order