使用GROUP BY GROUPING SETS相当于把需要GROUP的集合用UNION ALL联合起来。当GROUPING SETS里面的分组元素越多时,使用GROUPING SETS比使用UNION ALL性能更好,这可能和使用GROUPING SETS只需要访问一次表有关。如下两段查询的结果是相等的: q1(GROUPING SETS):
- SELECT department_id, job_id, manager_id, AVG (salary)
- FROM employees
- GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));
-
-
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- SH_CLERK 122 3200
- AC_MGR 101 12000
- ST_MAN 100 7280
- ST_CLERK 121 2675
- SA_REP 148 8650
- SH_CLERK 120 2900
- SH_CLERK 124 2825
- MK_MAN 100 13000
- AD_PRES 24000
- FI_MGR 101 12000
- SA_REP 146 8500
- SH_CLERK 123 3475
- AD_ASST 101 4400
- IT_PROG 102 9000
- IT_PROG 103 4950
- FI_ACCOUNT 108 7920
- PU_MAN 100 11000
- ST_CLERK 122 2700
- SA_REP 145 8500
- AC_ACCOUNT 205 8300
- AD_VP 100 17000
-
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- ST_CLERK 120 2625
- ST_CLERK 124 2925
- SA_REP 147 7766.66667
- SA_REP 149 8333.33333
- HR_REP 101 6500
- PR_REP 101 10000
- ST_CLERK 123 3000
- SH_CLERK 121 3675
- PU_CLERK 114 2780
- SA_MAN 100 12200
- MK_REP 201 6000
- 110 AC_ACCOUNT 8300
- 90 AD_VP 17000
- 50 ST_CLERK 2785
- 80 SA_REP 8396.55172
- 50 ST_MAN 7280
- 80 SA_MAN 12200
- 110 AC_MGR 12000
- 90 AD_PRES 24000
- 60 IT_PROG 5760
- 100 FI_MGR 12000
-
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- 30 PU_CLERK 2780
- 50 SH_CLERK 3215
- 20 MK_MAN 13000
- 100 FI_ACCOUNT 7920
- SA_REP 7000
- 70 PR_REP 10000
- 30 PU_MAN 11000
- 10 AD_ASST 4400
- 20 MK_REP 6000
- 40 HR_REP 6500
-
- 52 rows selected.
q2(UNION ALL):
- SELECT NULL department_id, job_id, manager_id, AVG (salary)
- FROM employees
- GROUP BY (job_id, manager_id)
- UNION ALL
- SELECT department_id, job_id, NULL manager_id, AVG (salary)
- FROM employees
- GROUP BY (department_id, job_id);
-
-
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- SH_CLERK 122 3200
- AC_MGR 101 12000
- ST_MAN 100 7280
- ST_CLERK 121 2675
- SA_REP 148 8650
- SH_CLERK 120 2900
- SH_CLERK 124 2825
- MK_MAN 100 13000
- AD_PRES 24000
- FI_MGR 101 12000
- SA_REP 146 8500
- SH_CLERK 123 3475
- AD_ASST 101 4400
- IT_PROG 102 9000
- IT_PROG 103 4950
- FI_ACCOUNT 108 7920
- PU_MAN 100 11000
- ST_CLERK 122 2700
- SA_REP 145 8500
- AC_ACCOUNT 205 8300
- AD_VP 100 17000
-
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- ST_CLERK 120 2625
- ST_CLERK 124 2925
- SA_REP 147 7766.66667
- SA_REP 149 8333.33333
- HR_REP 101 6500
- PR_REP 101 10000
- ST_CLERK 123 3000
- SH_CLERK 121 3675
- PU_CLERK 114 2780
- SA_MAN 100 12200
- MK_REP 201 6000
- 110 AC_ACCOUNT 8300
- 90 AD_VP 17000
- 50 ST_CLERK 2785
- 80 SA_REP 8396.55172
- 50 ST_MAN 7280
- 80 SA_MAN 12200
- 110 AC_MGR 12000
- 90 AD_PRES 24000
- 60 IT_PROG 5760
- 100 FI_MGR 12000
-
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- 30 PU_CLERK 2780
- 50 SH_CLERK 3215
- 20 MK_MAN 13000
- 100 FI_ACCOUNT 7920
- SA_REP 7000
- 70 PR_REP 10000
- 30 PU_MAN 11000
- 10 AD_ASST 4400
- 20 MK_REP 6000
- 40 HR_REP 6500
-
- 52 rows selected.
Oracle PL/SQL之GROUPING 函数Oracle PL/SQL之IN OUT NOCOPY相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)