Java 行编号()未正确排序记录
我不得不将数据从oracle表复制到文件中 我有一个连接查询,它获取800k条记录,所以我使用row_number()函数和order by子句生成了4个文件,每个文件包含200k条记录 查询: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
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,我使用了这个查询,而不是检查序列,我创建了一个类来检查其中是否有重复的记录,但是没有。