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
Java 行编号()未正确排序记录_Java_Sql_Oracle_Row Number - Fatal编程技术网

Java 行编号()未正确排序记录

Java 行编号()未正确排序记录,java,sql,oracle,row-number,Java,Sql,Oracle,Row Number,我不得不将数据从oracle表复制到文件中 我有一个连接查询,它获取800k条记录,所以我使用row_number()函数和order by子句生成了4个文件,每个文件包含200k条记录 查询: SELECT * FROM ( SELECT ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn, FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATAL

我不得不将数据从oracle表复制到文件中

我有一个连接查询,它获取800k条记录,所以我使用row_number()函数和order by子句生成了4个文件,每个文件包含200k条记录

查询:

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end;
参数:

For 1st File  : start =1 ,end = 200000
For 2nd File  : start =200001 ,end = 400000
For 3rd File  : start =400001 ,end = 600000
For 4th File  : start =600001 ,end = 800000
但当我在sql查询浏览器中使用此查询检查最后10行时,文件的最后10行不同,即文件和sql查询浏览器中的顺序不同

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER(  order by FILE_KEY desc ) rn,
        FILE_KEY,ROUTING_NO,INTLROUT_TYPE,ABBR_COUNTRY_CODE_2D,HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO=rout.FILE_KEY) 
WHERE rn BETWEEN 709990 AND 80000;

这可能是因为你有这样的东西

row_number file_key 
799998     same_number
799999     same_number
800000     same_number
800001     same_number
800002     same_number
800003     same_number
800004     same_number
因为您是按文件密钥订购的

你是如何观察到不同的数据的?从您的其他专栏中。因此,您可以使用:

SELECT  ROW_NUMBER() OVER(order by FILE_KEY desc, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO ) rn
或者(第二个原因),您的基表在查询之间发生了更改

UDPDATE:您可以使用
use\u hash
提示加快查询速度。5小时对于这个查询来说太多了

SELECT * FROM (
    SELECT  /*+use_hash(rout loc)*/
        ROW_NUMBER() OVER(order by FILE_KEY desc, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end;

在over子句中,按BANK_INTL_LOC_TBL中的唯一字段排序:

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER ( order by loc.**LOC_KEY** desc ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end
ORDER BY rn;
更新:根据@Shannon遣散费评论

添加order by子句

如果您在Oracle安装中有空闲的磁盘(您应该这样做!),则不必运行内部查询4次,而是可以更快地执行以下操作

CREATE TABLE bank_data
NOLOGGING
PARALLEL 4
AS SELECT  ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn,
    FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
WHERE loc.CATALOG_NO = rout.FILE_KEY);
要使用的并行量(我这里的示例中的数字
4
)将取决于数据库能够处理多少并发工作,主要取决于CPU的数量

完成后(应该不到5个小时!)您可以在
bank\u dump
表上运行简单的选择来提取所需的记录

SELECT *
FROM bank_dump
where rn < 200000
选择*
从银行转储
其中rn<200000

例如,对于第一个数据集。

哪个表是主表,哪个表是详细表?如果BANK_INTL_LOC_TBL是details,那么同一个FILE_键在结果集中是否可能不止一次?是的BANK_INTL_LOC_TBL是details,FILE_键不止一次如果查询中没有
order by
子句,写入文件的行的顺序可能不同于
row_number()
顺序。因此,如果更正为使用唯一键,则上次查询可能不会给出文件的最后十行,而只是文件中某个位置的十行。您好,a.B,我使用了CATALOG_NO,它是BANK_INTL_LOC_TBL主键,但它在查询浏览器中显示的最后10条记录序列与file_key相同,那么,更改为CATALOG_NO是否会在文件中生成正确且一致的行序列?@neel.1708您是否尝试使用我的查询生成4个文件,然后进行验证?好的,生成文件几乎需要5个小时,因此我想在此之前确认,生成文件后确认:)谢谢Florin Ghita,谢谢Florin和Shannon,我使用了这个查询,而不是检查序列,我创建了一个类来检查其中是否有重复的记录,但是没有。