ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 小议分析函数中排序对结果的影响(二)

小议分析函数中排序对结果的影响(二)

原创 Linux操作系统 作者:yangtingkun 时间:2009-01-12 23:51:20 0 删除 编辑

分析函数中经常会包括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根据记录读取的顺序返回记录,得到的结果是132

上一篇讨论了如果加上包括排序的分析函数,会对结果造成何种影响,下面描述一下,出现多个排序不同的分析函数,会如何影响查询结果。

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博客 ” ,链接:http://blog.itpub.net/4227/viewspace-536542/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10525195