ITPub博客

首页 > 数据库 > Oracle > row_number 函数和关联更新

row_number 函数和关联更新

原创 Oracle 作者:a960549548 时间:2024-03-29 08:57:35 0 删除 编辑

生成测试数据,房间号数据如下:

CREATE TABLE hotel (floor_nbr,room_nbr) AS
SELECT 1,100 FROM DUAL UNION ALL
SELECT 1,100 FROM DUAL UNION ALL
SELECT 2,100 FROM DUAL UNION ALL
SELECT 2,100 FROM DUAL UNION ALL
SELECT 3,100 FROM DUAL;

 

里面的房间号是不对的,一般是 101 、 102 、 201 、 202 的形式。现要求重新生成房间号,可以用 row_number 函数来更新数据,重新生成房间号。

 

update hotel set room_nbr =  floor_nbr * 100 + row_number() over(partition by floor_nbr order by rownum);

 

ORA-30483: window  函数在此禁用

 

试试看 “ 可更新 VIEW”

update (select room_nbr,
               floor_nbr * 100 + row_number() over(partition by floor_nbr order by rowid) as new_nbr
          from hotel)
   set room_nbr = new_nbr;

  

ORA-01732: 此视图的数据操纵操作非法

 

update 再嵌套一层倒是可以实现:

update hotel a
   set room_nbr = (select room_nbr
                     from (select floor_nbr * 100 + row_number() over(partition by floor_nbr order by rowid) as room_nbr
                             from hotel) b
                    where a.rowid = b.rowid);

I Ici I Operation  TABLE OUTPUT  Name  HOTEL  HOTEL  HOTEL Il  Starts  1  1  1  E-Rows  A-Rows  25  A—Time  1  3  4  TABLE ACCESS FULL  VIEW  WINDOW SORT  TABLE Access FULL I  Buffers  37  37  13  10  10  10  CUem I  2048  IYem I  2048  Used-Yem I  2048

 

select * from hotel;

FLn0R NER  Rom NER

 

试试 merge into 的方式,也可以:

merge into hotel a
using (select rowid as rid,floor_nbr * 100 + row_number() over(partition by floor_nbr order by rowid) as room_nbr
         from hotel) b
on (a.rowid = b.rid)
when matched then
  update set a.room_nbr = b.room_nbr;

 

I Ici I Operation  TABLE OUTPUT  Name  HOTEL  HOTEL  Starts  E-Rows  A-Rows  A—Time  o  1  3  4  7  MERGE  MERGE  VIEW  HASH JOIN  VIEW  WINDOW SORT  TABLE Access FULL I  TABLE Access FULL I  Buffers  11  11  4  4  2  CUem I  1S72KI  73728 1  IYem I  1S72KI  73728 1  Used-Yem I  1108K

 

可以看到,使用 update 嵌套更新的方式,子查询全表扫描要 5 次;但是 merge into ,子查询只需要全表扫描一次。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70013625/viewspace-3010822/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE,MySQL 8.0 OCP,PMP,拥有OceanBase OBCP,TiDB PCTP,GoldenDB GDCP等多项认证,ITPUB认证专家,微信公众号:DBA之友。

注册时间:2022-02-08

  • 博文量
    132
  • 访问量
    171523