【发布时间】:2015-06-14 01:02:19
【问题描述】:
在 Oracle 11g 中,我有一个名为 ITEM 的表,其中每条记录被分类为 maingroup 和 subgroup,如下所示:
+-------+---------+----------+
item_id maingroup subgroup
+-------+---------+---------+
1 group1 subgroup1
2 group1 subgroup2
3 group2 subgroup1
4 group2 subgroup2
...
我必须编写一个程序来报告表ITEM 中的项目数。报告输出将与此类似:
subgroup1 subgroup2 group_total
group1 10 5 15
group2 0 1 1
subgroup_total 10 6 16
为此,我将编写一个 SQL 来查询数据,然后使用 Java 重新格式化输出。 SQL 应该自己生成完整的报告,即我将只使用 Java 重新格式化输出而不进行任何计算。所以,我决定 SQL 的输出应该是这样的:
+--------------+-----------+-----+
maingroup subgroup cnt
+--------------+-----------+-----+
group1 subgroup1 10
group1 subgroup2 5
group1 group_total 15
group2 subgroup1 0
group2 subgroup2 1
group2 group_total 1
subgroup_total subgroup1 10
subgroup_total subgroup2 6
subgroup_total group_total 16
理想情况下,SQL 应该像
select maingroup, subgroup, count(*) cnt from ITEM
group by maingroup, subgroup union all
select maingroup, 'group_total' as subgroup, count(*) cnt from ITEM
group by maingroup union all
select 'subgroup_total' as maingroup, subgroup, count(*) cnt from ITEM
group by subgroup;
但是不,我简化了表格ITEM 让问题更容易理解,实际上,为了弥补这个ITEM,我必须使用一个很大的子查询,所以它实际上看起来像
select maingroup, subgroup, count(*) cnt from
(select maingroup, subgroup from ...) ITEM
group by maingroup, subgroup union all
select maingroup, 'group_total' as subgroup, count(*) cnt from
(select maingroup, subgroup from ...) ITEM
group by maingroup union all
select 'subgroup_total' as maingroup, subgroup, count(*) cnt from
(select maingroup, subgroup from ...) ITEM
group by subgroup;
使用相同的大子查询 3 次。我希望我可以重用这个子查询,但我没有创建表或使用 WITH 子句的权限。 是否可以重新排列上述 SQL 以使子查询 ITEM 只处理一次而不创建临时表或使用 WITH 子句?
【问题讨论】:
-
创建一个
(materialized) view怎么样?您是否有权创建view? -
@avk 很遗憾,我也没有那个权限。
-
你为什么没有权限来使用 WITH 子句;这不是特权(例如创建表或 MV),那么这是出于某种原因对您施加的限制吗?
-
@AlexPoole 实际上,当我使用 WITH 子句时,它不会返回任何数据,正如这篇文章 (stackoverflow.com/questions/7506499/…) 所建议的那样,我认为这是由于权限问题。