Sql 在列中显式设置ROWNUM
我正在尝试将大型表更新拆分为多个插入到工作表中。其中一个查询需要使用其中的行号。在oracle中的INSERT中,我是否可以显式添加Sql 在列中显式设置ROWNUM,sql,oracle,Sql,Oracle,我正在尝试将大型表更新拆分为多个插入到工作表中。其中一个查询需要使用其中的行号。在oracle中的INSERT中,我是否可以显式添加ROWNUM作为显式列?这是一个最终用于报告操作的工作表,其中包含一个讨厌的partion over子句,并且有一个真正的行号是很有帮助的 create table MY_TABLE(KEY number,SOMEVAL varchar2(30),EXPLICIT_ROW_NUMBER NUMBER); INSERT /*+PARALLEL(AUTO) *
ROWNUM
作为显式列?这是一个最终用于报告操作的工作表,其中包含一个讨厌的partion over子句,并且有一个真正的行号是很有帮助的
create table MY_TABLE(KEY number,SOMEVAL varchar2(30),EXPLICIT_ROW_NUMBER NUMBER);
INSERT /*+PARALLEL(AUTO) */ INTO MY_TABLE(KEY,SOMEVAL,EXPLICIT_ROW_NUMBER) (
SELECT /*+PARALLEL(AUTO) */ KEY,SOMEVAL,ROWNUM
FROM PREVIOUS_VERSION_OF_MY_TABLE
);
其中,MY\u表的上一版本既有一个键
又有一个SOMEVAL
字段
我希望它按照内部select语句的顺序对行进行编号。因此,select中的第一行(如果显式运行的话)的ROWNUM为1,等等。我不希望它反转,等等
上表有超过80MM的记录。最初我使用了一个更新,当我运行它时,我得到了一些错误,说我用完了撤销空间。我现在没有确切的错误消息了
我正试图用多个工作表来完成一件事,而我会用一个或多个更新来完成这件事。显然,要为这个查询添加撤销空间(我们公司的数据库团队说),而不让我成为DBA,或者在硬盘上花费大约100美元并将其连接到实例,是很困难、不可能的。所以我需要编写一个更难的查询来绕过这个限制。目标是在该会话中具有会话id和时间戳,但是对于会话中的每个时间戳(除了最后一个时间戳),显示下一个会话。原始查询包括以下内容:
update sc_hub_session_activity schat
set session_time_stamp_rank = (
select /*+parallel(AUTO) */ order_number
from (
select /*+parallel(AUTO) */ schat_all.explicit_row_number as explicit_row_number,row_number() over (partition by schat_all.session_key order by schat_all.session_key,schat_all.time_stamp) as order_number
from sc_hub_session_activity schat_all
where schat_all.session_key=schat.session_key
) schat_all_group
where schat.explicit_row_number = schat_all_group.explicit_row_number
);
commit;
update sc_hub_session_activity schat
set session_next_time_stamp = (
select /*+parallel(AUTO) */ time_stamp
from sc_hub_session_activity schat2
where (schat2.session_time_stamp_rank = schat.session_time_stamp_rank+1) and (schat2.session_key = schat.session_key)
);
commit;
“将大型表更新拆分为多个插入到工作表中”听起来很奇怪-您的语句有什么问题,它应该按预期工作。但是,ROWNUM
的顺序将是随机的,因此我看不出它有什么用途。只有指定orderby
语句,才能保证排序。甚至这个select语句也可能根据各种原因给出不同的顺序,这意味着这里的行号是毫无意义的。因此,你最好描述你试图解决的问题,而不是想象中的解决方案。“并且有一个真实的行号”——没有“真实”的行号。关系表中的行未排序。您唯一可以排序(从而获得“真实”的行号)的是查询结果,它需要一个orderby
来获得有保证的排序顺序,尽管您可以使用row\u number()
分析函数(它无论如何都不是“讨厌的”;我不确定您为什么认为分析函数可以?)根据所需的顺序标记行。