Oracle PL/SQL之GROUP BY GROUPING SETS


使用GROUP BY GROUPING SETS相当于把需要GROUP的集合用UNION ALL联合起来。

当GROUPING SETS里面的分组元素越多时,使用GROUPING SETS比使用UNION ALL性能更好,这可能和使用GROUPING SETS只需要访问一次表有关。

如下两段查询的结果是相等的: 

q1(GROUPING SETS):

  1. SELECT   department_id, job_id, manager_id, AVG (salary)  
  2.     FROM employees  
  3. GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));  
  4.   
  5.   
  6. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)  
  7. ------------- ---------- ---------- -----------  
  8.               SH_CLERK          122        3200  
  9.               AC_MGR            101       12000  
  10.               ST_MAN            100        7280  
  11.               ST_CLERK          121        2675  
  12.               SA_REP            148        8650  
  13.               SH_CLERK          120        2900  
  14.               SH_CLERK          124        2825  
  15.               MK_MAN            100       13000  
  16.               AD_PRES                     24000  
  17.               FI_MGR            101       12000  
  18.               SA_REP            146        8500  
  19.               SH_CLERK          123        3475  
  20.               AD_ASST           101        4400  
  21.               IT_PROG           102        9000  
  22.               IT_PROG           103        4950  
  23.               FI_ACCOUNT        108        7920  
  24.               PU_MAN            100       11000  
  25.               ST_CLERK          122        2700  
  26.               SA_REP            145        8500  
  27.               AC_ACCOUNT        205        8300  
  28.               AD_VP             100       17000  
  29.   
  30. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)  
  31. ------------- ---------- ---------- -----------  
  32.               ST_CLERK          120        2625  
  33.               ST_CLERK          124        2925  
  34.               SA_REP            147  7766.66667  
  35.               SA_REP            149  8333.33333  
  36.               HR_REP            101        6500  
  37.               PR_REP            101       10000  
  38.               ST_CLERK          123        3000  
  39.               SH_CLERK          121        3675  
  40.               PU_CLERK          114        2780  
  41.               SA_MAN            100       12200  
  42.               MK_REP            201        6000  
  43.           110 AC_ACCOUNT                   8300  
  44.            90 AD_VP                       17000  
  45.            50 ST_CLERK                     2785  
  46.            80 SA_REP                 8396.55172  
  47.            50 ST_MAN                       7280  
  48.            80 SA_MAN                      12200  
  49.           110 AC_MGR                      12000  
  50.            90 AD_PRES                     24000  
  51.            60 IT_PROG                      5760  
  52.           100 FI_MGR                      12000  
  53.   
  54. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)  
  55. ------------- ---------- ---------- -----------  
  56.            30 PU_CLERK                     2780  
  57.            50 SH_CLERK                     3215  
  58.            20 MK_MAN                      13000  
  59.           100 FI_ACCOUNT                   7920  
  60.               SA_REP                       7000  
  61.            70 PR_REP                      10000  
  62.            30 PU_MAN                      11000  
  63.            10 AD_ASST                      4400  
  64.            20 MK_REP                       6000  
  65.            40 HR_REP                       6500  
  66.   
  67. 52 rows selected.  

q2(UNION ALL):

  1. SELECT   NULL department_id, job_id, manager_id, AVG (salary)  
  2.     FROM employees  
  3. GROUP BY (job_id, manager_id)  
  4. UNION ALL  
  5. SELECT   department_id, job_id, NULL manager_id, AVG (salary)  
  6.     FROM employees  
  7. GROUP BY (department_id, job_id);  
  8.   
  9.   
  10. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)  
  11. ------------- ---------- ---------- -----------  
  12.               SH_CLERK          122        3200  
  13.               AC_MGR            101       12000  
  14.               ST_MAN            100        7280  
  15.               ST_CLERK          121        2675  
  16.               SA_REP            148        8650  
  17.               SH_CLERK          120        2900  
  18.               SH_CLERK          124        2825  
  19.               MK_MAN            100       13000  
  20.               AD_PRES                     24000  
  21.               FI_MGR            101       12000  
  22.               SA_REP            146        8500  
  23.               SH_CLERK          123        3475  
  24.               AD_ASST           101        4400  
  25.               IT_PROG           102        9000  
  26.               IT_PROG           103        4950  
  27.               FI_ACCOUNT        108        7920  
  28.               PU_MAN            100       11000  
  29.               ST_CLERK          122        2700  
  30.               SA_REP            145        8500  
  31.               AC_ACCOUNT        205        8300  
  32.               AD_VP             100       17000  
  33.   
  34. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)  
  35. ------------- ---------- ---------- -----------  
  36.               ST_CLERK          120        2625  
  37.               ST_CLERK          124        2925  
  38.               SA_REP            147  7766.66667  
  39.               SA_REP            149  8333.33333  
  40.               HR_REP            101        6500  
  41.               PR_REP            101       10000  
  42.               ST_CLERK          123        3000  
  43.               SH_CLERK          121        3675  
  44.               PU_CLERK          114        2780  
  45.               SA_MAN            100       12200  
  46.               MK_REP            201        6000  
  47.           110 AC_ACCOUNT                   8300  
  48.            90 AD_VP                       17000  
  49.            50 ST_CLERK                     2785  
  50.            80 SA_REP                 8396.55172  
  51.            50 ST_MAN                       7280  
  52.            80 SA_MAN                      12200  
  53.           110 AC_MGR                      12000  
  54.            90 AD_PRES                     24000  
  55.            60 IT_PROG                      5760  
  56.           100 FI_MGR                      12000  
  57.   
  58. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)  
  59. ------------- ---------- ---------- -----------  
  60.            30 PU_CLERK                     2780  
  61.            50 SH_CLERK                     3215  
  62.            20 MK_MAN                      13000  
  63.           100 FI_ACCOUNT                   7920  
  64.               SA_REP                       7000  
  65.            70 PR_REP                      10000  
  66.            30 PU_MAN                      11000  
  67.            10 AD_ASST                      4400  
  68.            20 MK_REP                       6000  
  69.            40 HR_REP                       6500  
  70.   
  71. 52 rows selected.  

相关内容