每次查询时,Order By子句返回不同的结果

时间:2018-08-08 08:07:52

标签: sql oracle oracle11g

我有一个包含以下各列的表Exc。

TIME    DATE    
CODE    CHAR(9 BYTE)    
VALUE   NUMBER(5,2) 

表中没有序列号或主键。 由于表中没有唯一的ID,因此我编写了以下查询来为每一行生成唯一的编号,将每一行标识为唯一。

select time, code, value
from (select time, code, value, ROW_NUMBER() over (order by time) R from EXC) where R > :x;

x-保留最后一个最大行号的变量。

但是当我第二次运行上面的查询时,按索引时间的顺序对于相同时间的行以不同的顺序返回。我需要通过Oracle查询获得一致的订单。

请帮助我解决这个问题。

2 个答案:

答案 0 :(得分:1)

  

同一时间的行的顺序不同

如果time不是唯一的,那么您需要决定如何打破平局。我们看不到您的数据,但这至少应该是一致的:

select time,code,value, ROW_NUMBER() over (order by time, code, value) R
from EXC;

奇怪的是,您在内部查询中生成了R值,但没有在外部查询中使用它。如果只想用它来排序结果,则可以:

select time, code, value
from (
  select time, code, value, ROW_NUMBER() over (order by time, code, value) R
  from EXC
)
order by r;

或者只是:

select time, code, value
from EXC
order by time, code, value;

如果您确实也想查看R值,那么就不需要子查询:

select time, code, value, ROW_NUMBER() over (order by time, code, value) R
from EXC
order by r;

,甚至使用仅Oracle的rownum伪列:

select time, code, value, rownum R
from EXC
order by order by time, code, value;

  

我需要R值才能通过使用...来下次获取数据。

您可以将其与过滤器结合使用,就像您展示的一样:

select time, code, value
from (
  select time, code, value, ROW_NUMBER() over (order by time, code, value) R
  from EXC
)
where r > :x
order by r;

但是,如果您主要是用它来查找最新数据,则最好记录时间并直接进行过滤:

select time, code, value
from EXC
where time > :x
order by ...

请注意您如何维护该变量。

答案 1 :(得分:0)

尝试一下:

SELECT time, code, VALUE
  FROM (SELECT time, code, VALUE, ROW_NUMBER () OVER (ORDER BY time) R FROM EXC)
 ORDER BY r ASC;

它按您的行数排序输出。