WITH分析函数

  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、"一次分析,多次使用",提供性能,达到了"少读"的目标。

posted @ 2011-09-05 20:58  老猫-DB  阅读(181)  评论(0编辑  收藏  举报