分析函数中经常会包括ORDER BY语句,而这个语句会对Oracle的运行结果产生影响。
继续讨论复杂一些的情况。
小议分析函数中排序对结果的影响(一):http://yangtingkun.itpub.net/post/468/476949
分析函数中经常会包括ORDER BY语句,而这个语句会对Oracle的运行结果产生影响。
继续讨论复杂一些的情况。
小议分析函数中排序对结果的影响(一):http://yangtingkun.itpub.net/post/468/476949
仍然沿用上面一篇文章的例子:
SQL> SELECT * FROM T;
ID NAME
---------- ------------------------------
1 A
3 C
2 B
如果不加任何的排序,直接查询T表,Oracle根据记录读取的顺序返回记录,得到的结果是1、3、2。
上一篇讨论了如果加上包括排序的分析函数,会对结果造成何种影响,下面描述一下,出现多个排序不同的分析函数,会如何影响查询结果。
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1,
4 SUM(ID) OVER(ORDER BY ID DESC) SUM2
5 FROM T;
ID NAME SUM1 SUM2
---------- ------------------------------ ---------- ----------
3 C 6 3
2 B 3 5
1 A 1 6
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1,
4 SUM(ID) OVER(ORDER BY ID) SUM2
5 FROM T;
ID NAME SUM1 SUM2
---------- ------------------------------ ---------- ----------
1 A 6 1
2 B 5 3
3 C 3 6
看样子,Oracle采用了第二个出现的排序操作,作为最终结果返回的排序次序,而与排序是升序还是降序没有关系。
如果再增加新的排序操作呢:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1,
4 SUM(ID) OVER(ORDER BY ID DESC) SUM2,
5 MAX(ID) OVER(ORDER BY ID) MAX1
6 FROM T;
ID NAME SUM1 SUM2 MAX1
---------- ------------------------------ ---------- ---------- ----------
3 C 6 3 3
2 B 3 5 2
1 A 1 6 1
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1,
4 SUM(ID) OVER(ORDER BY ID) SUM2,
5 MAX(ID) OVER(ORDER BY ID DESC) MAX1
6 FROM T;
ID NAME SUM1 SUM2 MAX1
---------- ------------------------------ ---------- ---------- ----------
1 A 6 1 3
2 B 5 3 3
3 C 3 6 3
这个现象无非是两种情况,一种是SUM的排序优先级比MAX高,另一种就是对于Oracle来说,总会选择后出现的那种排序最为最终的排序结果。
SQL> SELECT ID,
2 NAME,
3 MAX(ID) OVER(ORDER BY ID) MAX1,
4 MIN(ID) OVER(ORDER BY ID) MIN1,
5 MAX(ID) OVER(ORDER BY ID DESC) MAX2,
6 SUM(ID) OVER(ORDER BY ID) SUM1
7 FROM T;
ID NAME MAX1 MIN1 MAX2 SUM1
---------- ------------------------------ ---------- ---------- ---------- ----------
3 C 3 1 3 6
2 B 2 1 3 3
1 A 1 1 3 1
这个例子就可以充分说明问题了,对于当前的情况,只有两种排序的可能性,ID升序和ID降序,Oracle选择了最后出现的那种排序操作作为了最终的排序结果。
将问题扩展多多列的情况:
SQL> INSERT INTO T VALUES (4, 'E');
已创建 1 行。
SQL> INSERT INTO T VALUES (5, 'D');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM T;
ID NAME
---------- ------------------------------
4 E
5 D
1 A
3 C
2 B
SQL> COL NAME FORMAT A5
SQL> SELECT ID,
2 NAME,
3 MAX(ID) OVER(ORDER BY ID) MAX1,
4 MAX(ID) OVER(ORDER BY ID DESC) MAX2,
5 MAX(ID) OVER(ORDER BY NAME) MAX3,
6 MAX(ID) OVER(ORDER BY NAME DESC) MAX4
7 FROM T;
ID NAME MAX1 MAX2 MAX3 MAX4
---------- ----- ---------- ---------- ---------- ----------
4 E 4 5 5 4
5 D 5 5 5 5
3 C 3 5 3 5
2 B 2 5 2 5
1 A 1 5 1 5
Oracle总会选择最后出现的分析函数中的排序方法,作为整个结果集的排序方法。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-536542/ ,如需转载,请注明出处,否则将追究法律责任。