Oracle SQL:ORDER BY非唯一字段是否确定?

Boe*_*ern 3 sql oracle oracle11g

让我们说我有一个观点 MYVIEW

COL1[CARCHAR2]    SORTINGCOL[NUMBER]
"itm1"            100
"itm2"            101
"itm3"            100
Run Code Online (Sandbox Code Playgroud)

我查询以下语句

SELECT *
FROM MYVIEW
ORDER BY SORTINGCOL;
Run Code Online (Sandbox Code Playgroud)

是否保证(=我可以依赖)返回的订单总是一样的吗?让我们说吧

  1. item1 (值为100)
  2. item3 (值为100)
  3. item2 (值为101)

很明显,item2总是会最终成为最后的,但对于item1item3用相同的SORTINGCOL价值呢?

Gor*_*off 14

一般而言,SQL,特别是Oracle不保证稳定的排序.也就是说,您可以运行相同的查询两次并获得不同的顺序 - 当键具有关系时.

这是因为SQL表(和结果集)表示无序集.因此,没有"自然"的顺序可以依赖.通常,最好在其中包含其他键order by以使排序稳定.

编辑:

我想补充一点想法.您的示例是在查询中进行整体排序,其中问题有点抽象 - 也就是说,查询的任何给定运行看起来都是正确的.窗函数会成为一个更大的问题.所以,有可能:

select v.*, row_number() over (order by sortingcol) as col1,
       row_number() over (order by sortingcol desc) as col2
from myview v
Run Code Online (Sandbox Code Playgroud)

会产生不一致的结果.在正常情况下,我们期望col1 + col2保持不变.然而,有了关系,通常情况并非如此.这会影响row_number()keep.它不会影响rank()dense_rank()一直处理关系.