Sql 不带order by子句的Oracle有序结果集

Sql 不带order by子句的Oracle有序结果集,sql,oracle,sql-order-by,Sql,Oracle,Sql Order By,有没有一种方法可以从oracle表中获取“ordered”结果集,而不实际使用“OrderBy”子句 我正在开发一个从oracle表(没有唯一列)读取数据的应用程序,我想引入某种恢复机制,以便在查询失败的情况下(例如,获取期间出现网络错误),我们避免读取已经获取的行 该应用程序是使用oracle OCI开发的,目前使用的是简单的select查询 有什么有效的机制来实现这一点吗?在一些非常特殊的条件下,您有一个定义的结果顺序,而没有任何ORDERBY子句。但是,您不应依赖于此,Oracle可能会随

有没有一种方法可以从oracle表中获取“ordered”结果集,而不实际使用“OrderBy”子句

我正在开发一个从oracle表(没有唯一列)读取数据的应用程序,我想引入某种恢复机制,以便在查询失败的情况下(例如,获取期间出现网络错误),我们避免读取已经获取的行

该应用程序是使用oracle OCI开发的,目前使用的是简单的select查询


有什么有效的机制来实现这一点吗?

在一些非常特殊的条件下,您有一个定义的结果顺序,而没有任何ORDERBY子句。但是,您不应依赖于此,Oracle可能会随时更改此行为


也许您可以计算总行数(执行查询后读取
SQL%ROWCOUNT
),并将此数与客户端上收到的记录进行核对。

正如Wernfried指出的,如果没有任何
ORDER BY
,则无法可靠地获得有序结果。但是问题假设,
orderby
是不可能的,因为没有唯一的列。至少有两种解决方法

1。ROWID.每个Oracle行都有一个唯一的伪列,
ROWID
。应用程序可以
按ROWID排序
,存储最新的
ROWID
,然后使用
,其中ROWID:last\u rownumber\u processed
将获得其余的行。第二个查询可能返回“first”1而不是“second”1,但应用程序不会在意。与第一个解决方法一样,如果数据在两次运行之间发生更改,此操作将失败

无论哪种方式,查询都必须支付排序费用:

----------------------------
| Id  | Operation          |
----------------------------
|   0 | SELECT STATEMENT   |
|   1 |  WINDOW SORT       |
|   2 |   TABLE ACCESS FULL|
----------------------------

案例1:

为了实现简单的恢复机制,唯一简单的方法是使用RowID

select t?.rowid, t1.*, t2.*, t3.* 
 from table1 t1, 
      table2 t2,
      table3 t3
where t1.? = t2.?
  and t2.? = t3.?
  and t?.rowid > :rowidProcessedPriorNetworkFailure
 order by t?.rowid 
t?.rowid的原因是您必须选择叶表

在以下情况下,应选择t3作为t?。 T2-T1:一个T2记录可能有一个或多个T1记录 T1-T3:一个T1记录可以有一个或多个T3记录

但请记住,每当Oracle维护底层物理结构(即Defragmation、Regorganization、将表移动到新数据文件)时,RowID都会发生变化

案例2:

如果是联接,请选择叶表。 选择具有最不同值的列。按该栏顺序排列。每当你必须恢复时,用手头上的最后一个值进行反向操作


希望这对你有帮助

我使用以下查询获得有序输出,而不使用“orderby”字。在这里,我想在不使用ORDERBY子句的情况下对empno进行排序

查询:

Select empno, sal, deptno, max(sal) over(partition by empno) from emp;
但是,您可以排除除empno和
max()
分析函数之外的任何列


如果您有任何问题,请告诉我。

IMHO如果它没有唯一的列,这实际上不是关系理论意义上的表。您应该添加一些PK并使用它。在数据仓库中,表中没有主键并不常见。如果没有
ORDER BY
,则无法从表中获取一致排序的数据。总是有
ROWID
,但使用它的风险自负。当然,如果删除并插入同一行,可能会得到不同的rowid。否。如果没有按排序的
,则无法保证您的结果将按任何特定顺序排列。您是想回答还是问什么?嗨,尼克,如果您运行查询的解释计划,“选项”列将显示“排序”。如果你得到不同的结果,请告诉我。
Select empno, sal, deptno, max(sal) over(partition by empno) from emp;