Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 在列中显式设置ROWNUM_Sql_Oracle - Fatal编程技术网

Sql 在列中显式设置ROWNUM

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) *

我正在尝试将大型表更新拆分为多个插入到工作表中。其中一个查询需要使用其中的行号。在oracle中的INSERT中,我是否可以显式添加
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()
分析函数(它无论如何都不是“讨厌的”;我不确定您为什么认为分析函数可以?)根据所需的顺序标记行。