首页 > 解决方案 > 在 Oracle SQL 中获取 rownum = 1 但不是 1 的数据

问题描述

得到结果(rownum = 1):

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum = 1

没有得到结果(rownum ≠ 1):

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum = 2  

标签: sqloracle

解决方案


这在文档中进行了解释。 rownum返回结果集时计算。因此,它仅在将新行放入结果集中时才会增加。

因此,它永远不会在没有值“1”的情况下取值“2”。

如解释:

大于正整数的 ROWNUM 值的条件测试始终为假。例如,此查询不返回任何行:

SELECT *
FROM employees
WHERE ROWNUM > 1;

提取的第一行被指定为 1 的 ROWNUM 并使条件为假。要获取的第二行现在是第一行,并且还分配了 1 的 ROWNUM 并使条件为假。随后所有行都不满足条件,因此不返回任何行。

解决方案通常是这样的:

SELECT rn, A.LOADPLAN_NAME
FROM (SELECT LOADPLAN_NAME, RUN_DATE, rownum as rn
      FROM DCBP13_BIA_ODIREPO.CITIZEN_ODI_REQUIRED_LOADPLANS      
      WHERE RUN_DATE like '13-FEB-19'
      ORDER BY RUN_DATE DESC, LOADPLAN_NAME ASC
     ) A  
WHERE rn = 2;

推荐阅读