Oracle 神谕中的罗纳姆之谜
我正在努力获取基于rownum的数据。当我执行下面的查询以获得基于Oracle 神谕中的罗纳姆之谜,oracle,oracle11g,Oracle,Oracle11g,我正在努力获取基于rownum的数据。当我执行下面的查询以获得基于rownum 1到4的结果时,它工作正常 SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC ORDER BY CREATION_DATE DESC ) MI WHERE ROWNUM BETWEEN 1 AND 4; 但当我执行相同的查询以从rownum2到4获取结果时,它不工作,不会返回任何内容 SELE
rownum 1到4的结果时,它工作正常
SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC
ORDER BY CREATION_DATE DESC ) MI WHERE ROWNUM BETWEEN 1 AND 4;
但当我执行相同的查询以从rownum2到4
获取结果时,它不工作,不会返回任何内容
SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC
ORDER BY CREATION_DATE DESC ) MI WHERE ROWNUM BETWEEN 2 AND 4;
作为一种变通方法,当我使用一个以上的SELECT语句时,它工作得很好,但我认为仅对rownum多次使用SELECT不是一种好方法
SELECT * FROM (SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC
ORDER BY CREATION_DATE DESC ) MI) WHERE TOTAL BETWEEN 2 AND 4;
您能帮我创建优化查询吗?ROWNUM
很奇怪,因为它可以作为查询条件的一部分进行计算-但如果该行随后未能通过该筛选,则分配给它的ROWNUM
值将可用于下一行
这样做的一个重要影响是,如果您使用任何排除ROWNUM
值1的条件,您将永远无法获得匹配。根据该条件测试的第一行为第1行;但随后它将无法通过测试,因此下一行将被视为第1行;等等
因此,介于2和4之间的条件ROWNUM
永远不可能为真
您找到的解决方法是传统的。另一种方法是使用分析函数对行进行排序,然后根据排序进行筛选,例如:
SELECT MI.* FROM (
SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
FROM ELEC_AUTO_MERC
) MI
WHERE the_rank BETWEEN 2 AND 4;
几个分析函数——秩、稠密秩和行数——可用于此目的,并将产生稍有不同的结果,尤其是在有联系的情况下。查看文档