一尘不染

Oracle SQL:ORDER BY非唯一字段是确定性的吗?

sql

假设我有一个观点 MYVIEW

COL1[CARCHAR2]    SORTINGCOL[NUMBER]
"itm1"            100
"itm2"            101
"itm3"            100

我查询以下语句

SELECT *
FROM MYVIEW
ORDER BY SORTINGCOL;

是否可以 保证 (=我可以依靠)返回的订单始终是相同的?比方说

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

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


阅读 134

收藏
2021-05-30

共1个答案

一尘不染

不能。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()始终处理关系。

2021-05-30