假设我有一个观点 MYVIEW
COL1[CARCHAR2] SORTINGCOL[NUMBER]
"itm1" 100
"itm2" 101
"itm3" 100
我查询以下语句
SELECT *
FROM MYVIEW
ORDER BY SORTINGCOL;
是吗保证 (=我可以依赖)返回的订单总是相同的?让我们说
item1
(值为 100)item3
(值为 100)item2
(值为 101)很明显
item2
将永远是最后一个,但是 item1
呢?和 item3
同SORTINGCOL
值(value)?
最佳答案
不可以。一般的 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
会产生不一致的结果。在正常情况下,我们会期望
col1 + col2
保持不变。但是,对于关系,情况往往并非如此。这会影响 row_number()
和 keep
.不影响rank()
或 dense_rank()
始终如一地处理关系。
关于sql - Oracle SQL : Is ORDER BY non unique field deterministic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34396818/