Oracle 神谕中的罗纳姆之谜

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的数据。当我执行下面的查询以获得基于
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;
几个分析函数——秩、稠密秩和行数——可用于此目的,并将产生稍有不同的结果,尤其是在有联系的情况下。查看文档