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)
是否保证(=我可以依赖)返回的订单总是一样的吗?让我们说吧
item1
(值为100) item3
(值为100) item2
(值为101) 很明显,item2
总是会最终成为最后的,但对于item1
并item3
用相同的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()
一直处理关系.