create table test_1
(
x number(10),
y number(10)
);
insert into test_1 values (1,110);
insert into test_1 values (2,120);
insert into test_1 values (2,80);
insert into test_1 values (3,150);
insert into test_1 values (3,30);
insert into test_1 values (3,60);
commit;
select * from test_1;
X Y
---------- ----------
1 110
2 120
2 80
3 150
3 30
3 60
6 rows selected.
需求描述
按照x列分组后统计y列的总值,是选出比y列总值的三分之一大的那些分组统计信息。
1、使用子查询方式实现
SELECT x, SUM(y) AS total_y
FROM test_1
GROUP BY x
HAVING SUM(y) > (SELECT SUM(y) / 3 FROM test_1)
ORDER BY total_y;
X TOTAL_Y
---------- ----------
2 200
3 240
2、WITH Clause方法闪亮登场
WITH secooler_sum AS (SELECT x, SUM (y) total_y
FROM test_1
GROUP BY x)
SELECT x, total_y
FROM secooler_sum
WHERE total_y > (SELECT SUM (total_y) / 3 FROM secooler_sum)
ORDER BY total_y;
X TOTAL_Y
---------- ----------
2 200
3 240
这里的查询语句不是以select开始的,而是以"WITH"关键字开头。
可以认为Oracle在真正进行查询之前预先构造了一个临时表secooler_sum,
之后我们便可多次使用它做进一步的分析和处理。
WITH Clause方法的优点
总结:
1、增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;
2、"一次分析,多次使用",提供性能,达到了"少读"的目标。