我有一个很长的SQL查询,它使用rownum但提供了错误的值。以下是我的询问:
Select *
FROM ( SELECT *
FROM R this_
LEFT OUTER JOIN TS
ON this_.T1 = TS.T1
LEFT OUTER JOIN T
ON TS.T2 = T.T2
LEFT OUTER JOIN TS system4_
ON T.SRC = system4_.system_id
LEFT OUTER JOIN TS system6_
ON T.TGT = system6_.system_id
LEFT OUTER JOIN TS system7_
ON touchpoint3_.INIT = system7_.system_id
LEFT OUTER JOIN ST
ON TS_.SC = ST.SC
LEFT OUTER JOIN RS
ON this_.status_id = RS.status_id
LEFT OUTER JOIN client client5_ ONsystem4_.CLIENT_ID=client5_.CLIENT_ID
WHERE this_.status_id = 5
ORDER BY this_.ID --This is a column on R table
)WHERE ROWNUM <= 10
但是,如果我将rownum放在子查询中,我会得到正确的输出
WHERE this_.status_id = 5 and rownum<=10
任何人都可以告诉我为什么我的查询输出错误了吗?
答案 0 :(得分:0)
在内部查询中,ROWNUM <= 10
的测试将在应用ORDER BY this_.ID
之前完成,因此您可以接受Oracle返回数据的顺序(可能是它们出现的顺序)无论使用什么索引来访问它们。
在外部查询中,您已经提供了有序集,因此不能保证仅过滤前10行的结果是相同的,因为分配行号时元素的顺序不同。
您应该使用ROWNUM
限制查询结果的唯一时间是:
您的要求的最佳方法可能是使用RANK
或DENSE_RANK
分析函数。
快速Google显示已经有几个examples how to do this。