我正在尝试针对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万条记录。
:X
Select Count(*)
Select *
任何帮助将非常感激。
您不能rownum像这样使用。 rownum当查询实际返回值时才计算-仅在返回行时才计算。因此,该语句:
rownum
where rownum = 2
永远不会返回值,因为在“ 2”之前需要有一个“ 1”。
如果您使用的是Oracle 12+,则可以将offset子句与一起使用fetch first <n> rows only。在早期版本中,您可以用于row_number() over ()将行号计算为列,并在中使用它where。
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))