我在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
现在我的查询: 1)我想" From子句"在上面的查询中缺少。
更新了查询:
update (select t.*,
row_number() over (order by emp_id) as newid
from employee t ) toupdate
set emp_id = newid;
2)当我运行上述查询时,它给出了错误"数据操作操作在此视图上不合法"。
任何人都可以解释上述解决方案如何在这里工作。任何人都可以发布完整更新查询。谢谢。
答案 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)