小编典典

Oracle SQL:按ROWNUM进行过滤时应返回的结果不返回结果

sql

我正在尝试针对Oracle数据库运行以下SQL:

SELECT *
FROM(SELECT crd.Request_ID,
        crd.Requested_Start_Date Scheduled_Start,
        crd.Actual_Start_Date Start_Date,
        crd.Actual_Completion_Date Finish_Date,
        crd.Status_Code
    FROM ((SELECT fcr.Request_ID,
                fcr.Requested_Start_Date,
                fcr.Actual_Start_Date,
                fcr.Actual_Completion_Date,
                fcr.Status_Code,
                fcr.Oracle_Session_ID,
                fcr.Responsibility_ID
            FROM Applsys.FND_Concurrent_Requests fcr
            WHERE fcr.Oracle_Session_ID IS NOT NULL)
        UNION ALL (SELECT xcr.Request_ID,
                xcr.Requested_Start_Date,
                xcr.Actual_Start_Date,
                xcr.Actual_Completion_Date,
                xcr.Status_Code,
                xcr.Oracle_Session_ID,
                xcr.Responsibility_ID
            FROM xxfnd.emr_FND_Concurrent_Requests xcr
            WHERE xcr.Oracle_Session_ID IS NOT NULL)) crd
    WHERE crd.Actual_Start_Date >= to_Date('06/01/2014', 'MM/DD/YYYY')
    ORDER BY 3, 1)
WHERE Rownum < (1000000 * to_Number(:X))
    AND ROWNUM >= (1000000 * (to_Number(:X)-1))

对于:X设置为1,我得到(预期)第999,999行数据。但是,当我设置:X为2时,什么也不会返回。尽管事实是当我完全Select Count(*)代替Select *并使用Where子句时,结果表明子查询返回了超过900万条记录。

任何帮助将非常感激。


阅读 166

收藏
2021-04-15

共1个答案

小编典典

您不能rownum像这样使用。 rownum当查询实际返回值时才计算-仅在返回行时才计算。因此,该语句:

where rownum = 2

永远不会返回值,因为在“ 2”之前需要有一个“ 1”。

如果您使用的是Oracle 12+,则可以将offset子句与一起使用fetch first <n> rows only。在早期版本中,您可以用于row_number() over ()将行号计算为列,并在中使用它where

实际上,您的查询已经使用了子查询,因此您可以执行以下操作:

select *
from (select . . .,
             row_number() over (order by Request_ID, Actual_Start_Date) as rn
      . . .
     ) t
WHERE rn < (1000000 * to_Number(:X) and)
      rn >= (1000000 * (to_Number(:X)-1))
2021-04-15