我有SQL SELECT查询返回很多行,我必须将它拆分成几个分区。即,将max results设置为10000并迭代调用查询选择时间的行,并增加第一个结果(0,10000,20000)。所有查询都在同一个事务中完成,我的查询所获取的数据在此过程中不会发生变化(但这些表中的其他数据可能会发生变化)。
只使用普通选择是否可以:
select a from b where...
或者我必须使用select:
来使用orderselect a from b where ... order by c
为了确保我能获得所有行?换句话说,是否保证没有order by的查询总是以相同的顺序返回行?
向查询添加顺序会显着降低查询的性能。
如果重要的话,我正在使用Oracle。
编辑:不幸的是我无法利用可滚动游标。
答案 0 :(得分:5)
如果没有order by子句,绝对不能保证订单,但是您的结果是否具有确定性(除了订单)将取决于where子句。例如,如果您有一个唯一的ID列,并且每次访问时where子句包含不同的过滤器范围,那么您将得到无序的确定性结果,即:
select a from b where ID between 1 and 100
select a from b where ID between 101 and 200
select a from b where ID between 201 and 300
会返回不同的结果集,但订单不会得到任何保证。
答案 1 :(得分:3)
不,没有订单,不能保证查询总是以相同的顺序返回行。
答案 2 :(得分:2)
除非您在最外层查询上有订单,否则无法保证。
错误的SQL Server示例,但适用相同的规则。即使使用内部查询
,也无法保证订单SELECT
*
FROM
(
SELECT
*
FROM
Mytable
ORDER BY SomeCol
) foo
答案 3 :(得分:1)
使用Limit
所以你会这样做:
SELECT * FROM table ORDER BY id LIMIT 0,100
SELECT * FROM table ORDER BY id LIMIT 101,100
SELECT * FROM table ORDER BY id LIMIT 201,100
LIMIT将从您想要开始的位置开始,第二个变量将是您想要查看的结果数量。
这是一个很好的噱头。