我选择了这样:
select * from
(select aa.*,rownum as rn
from (select someRows
from (select *
from table a
left outer join mySecTable b)
left outer join otherTable c
where conditions) aa
order by aa.myColumn) ff
where ff.rn >=30 and rn<40
我想在没有完全扫描的情况下选择有序数据的10列,但是这个选择正在进行全扫描,无论最后的情况是什么,ff.rn >=30 and rn<40
或者没有选择的时间是相同的。
我的主要选择是
select * from
(select someRows
from
(select *
from myTable a
left outer join mySecTable b
) left outer join otherTable c
where conditions
比我想要订购此选择并采取10行。如果没有完全扫描,我怎么能这样做?
答案 0 :(得分:0)
似乎,您在指定rownum as rn
的同一级别选择order by aa.myColumn
。在这种情况下,rn将是无序的,查询将返回无序结果(因为它将rownum分配给行,之后将通过myColumn对它们进行排序)。
您应该将rownum移动到较高的SQL级别(再添加一个)或按顺序移动以降低SQL级别。
如果你有myColumn的索引,那么这个列的条件和&lt;或者&gt;永远回归真实可能有所帮助 像
where myColumn>0 -- for number
或
where myColumn>chr(0) -- for varchar
所以SQL应该看起来像
select * from
(select aa.*,rownum as rn
from (select someRows
from (select *
from table a
left outer join mySecTable b)
left outer join otherTable c
where conditions
AND myColumn>chr(0)
order by aa.myColumn) aa
WHERE rownum < 40) ff
where ff.rn >=30
(我将订单移至较低级别的SQL,添加了myColumn>chr(0)
条件并将左边界限移至较低级别SQL rownum<40
)