Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每次查询时返回不同结果的ORDERBY子句_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 每次查询时返回不同结果的ORDERBY子句

Sql 每次查询时返回不同结果的ORDERBY子句,sql,oracle,oracle11g,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

我有一个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-用于保存最后一个最大行数的变量

但是,当我第二次运行上述查询时,ORDERBY index time以不同的顺序返回具有相同时间的行。我需要从Oracle查询中获得一致的order by

请在这个问题上帮助我。

试试这个:

SELECT time, code, VALUE
  FROM (SELECT time, code, VALUE, ROW_NUMBER () OVER (ORDER BY time) R FROM EXC)
 ORDER BY r ASC;
它按您的rownum命令输出

具有相同时间的行的不同顺序

如果时间不是唯一的,那么你需要决定如何打破关系。我们无法查看您的数据,但这至少应该是一致的:

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

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

表会经常更新,所以我需要每10秒查询一次。因此,我需要R值,以便下次使用以下查询获取数据。我将使用诸如select time、code、select time中的值、code、value、order by time上的行数、EXC中的code R,其中R>:X;我将在此查询中使用上一个R值。因此,为了进行这样的查询,我应该依赖于一致的order by数据。是的,我可以使用下面的查询select time,code,value from EXC where time>:x order by。。。但问题是,假设我们正在获取行并完成查询,那么在表中插入同一时间的另一行时,我们可能会错过该行,因为我们将在下一次的查询中获取比上一次更大的行数。感谢现在多次使用上述查询,我能够看到一致的顺序数据但是我需要在R上设置一个where条件来检查R>以前获取的数据。如何做到这一点。你能给我提个建议吗。例如,当我最初查询其中有10行时。我将把这10行作为变量X,下次我将使用前面的变量在我的查询中查询rownum大于10的行。我尝试了以下查询,它似乎返回了一致的顺序。如果有任何问题,请提出建议。选择时间、代码、选择时间中的值、代码、值、按时间排序的行数、代码、EXC中的值R,其中R>:X按R排序@KMN如果您知道“X”变量的确切值,那么就可以了。你只需要确保“X”总是有必要的值。是的,我可以确保。我唯一关心的是数据检索顺序在任何时候都不应该改变。我们已经按时间、值和代码对其进行了排序,为什么在外部查询中我们要按rownum对其进行排序。不想知道它实际上是如何工作的,因为没有rownum的顺序,行的顺序是不一致的。请解释一下。