首页 > 解决方案 > Order By 子句每次查询时返回不同的结果

问题描述

我有一个表 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 查询中获得一致的顺序。

请在这个问题上帮助我。

标签: sqloracleoracle11g

解决方案


相同时间的行的不同顺序

如果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-onlyrownum伪列:

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 ...

当然要注意如何维护该变量。


推荐阅读