复合列

来源:互联网 发布:芜湖网络买花花店 编辑:程序博客网 时间:2024/04/29 21:47

复合列

      复合列是一个列的集合, 它在分组的时候计算作为一个单元被处理。如下面的语句, 在圆括号中指定列:

      ROLLUP(a,(b,c),d)

      在这里, (b,c)组成复合列, 并且作为一个单元被处理。通常, 复合列在ROLLUP、CUBE和GROUPING SETS中是有用的。例如, 在CUBE或ROLLUP中, 复合列将跳过某些级别上的聚合。

      即, GROUP BY ROLLUP(a,(b,c))

      相当于:

      GROUP BY A,B,C UNION ALL

      GROUP BY A UNION ALL

      GROUP BY ()

       在这里, (b,c)被作为一个单元处理, 并且ROLLUP将不被用于(b,c)。它就好象你有一个别名, 例如z, 用于(b,c), 这时GROUP BY表达式变为GROUP BY ROLLUP(a,z)。

       同样, GROUP BY CUBE((A,B),C)

       相当于

             GROUP BY A,B,C UNION ALL

             GROUP BY A,B UNION ALL

             GROUP BY C UNION ALL

             GROUP BY ()

      下面的表显示了分组集的声明和等价的GROUP BY声明。

       分组集语句                                                               等价的GROUP BY 语句

       GROUP BY GROUPIN SETS(A, B, C)                        GROUP BY A UNION ALL

                                                                                      GROUP BY B UNION ALL

                                                                                      GROUP BY C

       GROUP BY GROUPING SETS(A, B, (B,C))           GROUP BY A UNION ALL

                                                                                      GROUP BY B UNION ALL

                                                                                      GROUP BY B,C

       GROUP BY GROUPING SETS((A, B, C))                   GROUP BY A, B, C

       GROUP BY GROUPING SETS(A, (B), ())                    GROUP BY A UNION ALL

                                                                                      GROUP BY B UNION ALL

                                                                                      GROUP BY ()

        GROUP BY GROUPING SETS(A, ROLLUP(B,C))       GROUP BY A UNION ALL

        (GROUPING SETS表达式有一个组合列)                     GROUP BY ROLLUP(B,C)

                         

         

   幻灯片中的例子计算下面的分组;

  •    (DEPARTMENT_ID, JOB_ID, MANAGER_ID)
  •    (DEPARTMENT_ID)
  •    ()

  幻灯片中的例子也可以被写为:

  SELECT DEPARTMENT_ID, JOB_ID, MANAGER_ID, SUM(SALARY)

  FROM EMPLOYEES

  GROUP BY DEPARTMENT_ID, JOB_ID, MANAGER_ID

  UNION ALL

  SELECT DEPARTMENT_ID, TO_CHAR(NULL), TO_NUMBER(NULL), SUM(SALARY)

   FROM EMPLOYEES

  GROUP BY DEPARTMENT_ID

  UNION ALL

  SELECT TO_NUMBER(NULL), TO_CHAR(NULL), TO_NUMBER(NULL), SUM(SALARY)

  FROM EMPLOYEES

  GROUP BY () ;

  在缺少查看交叉查询块产生执行计划的优化器时, 前面的查询将需要三次基表EMPLOYEES扫描, 这将是非常低效的。因此建议使用复合列。

   再看下面的例子:

   SELECT DEPARTMENT_ID, JOB_ID, MANAGER_ID, SUM(SALARY)

   FROM EMPLOYEES

   GROUP BY ROLLUP(DEPARTMENT_ID, JOB_ID, MANAGER_ID) ;

   该查询, 在ORACLE服务器中计算下面的分组:

   1、(DEPARTMENT_ID, JOB_ID, MANAGER_ID)

   2、(DEPARTMENT_ID, JOB_ID)

   3、(DEPARTMENT_ID)

   4、()

   在上述的例子中, 如果你只对行(1)、(3)、(4)的分组感兴趣, 不使用复合列你就不能限制住计算那些不使用的分组。 如果使用复合列, 在累计时, 将JOB_ID和MANAGER_ID列作为一个单个的单元进行处理就成为可能。当计算ROLLUP和CUBE时, 在圆括号中附加的列被作为一个单元处理。幻灯片中的例子图示了该种处理。在圆括号中放入JOB_ID和MANAGER_ID列, 我们指示ORACLE服务器将JOB_ID和MANAGER_ID作为一个单独的单元处理, 好象一个复合列。

 

0 0
原创粉丝点击