假设我有一个观点 MYVIEW
MYVIEW
COL1[CARCHAR2] SORTINGCOL[NUMBER] "itm1" 100 "itm2" 101 "itm3" 100
我查询以下语句
SELECT * FROM MYVIEW ORDER BY SORTINGCOL;
是否可以 保证 (=我可以依靠)返回的订单始终是相同的?比方说
item1
item3
item2
很明显,item2总是会最终成为最后的,但对于item1并item3用相同的SORTINGCOL价值呢?
SORTINGCOL
不能。SQL通常,尤其是Oracle不能保证稳定的排序。也就是说,您可以运行两次相同的查询并获得不同的排序-当键绑定时。
这是因为SQL表(和结果集)表示 无序 集。因此,没有“自然”的命令可以依靠。通常,最好在中包含其他键order by以使排序稳定。
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()始终处理关系。
col1 + col2
row_number()
keep
rank()
dense_rank()