我有一个包含以下各列的表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查询获得一致的订单。
请帮助我解决这个问题。
答案 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;
它按您的行数排序输出。