站点图标 IDC铺

关于Oracle PL/SQL之WITH查询

为什么要用WITH?

1. 如果需要在一段复杂查询里多次应用同一个查询,用WITH可实现代码重用;

2. WITH查询类似将查询结果保留到用户临时表里,在大的复杂查询中可以减少IO,有一定的性能优化作用。

WITH查询有何限制与特性?

1. 如果当前schema下有与WITH查询别名相同的表,查询中WITH查询生成的表优先;

2. 只能用于select 语句;

3. WITH可包含一个或多个查询;

4. WITH查询可被其它查询或WITH查询引用。

示例:

[sql] view plaincopyprint?
  1. duzz$scott@orcl>select * from dept;
  2.     DEPTNO DNAME           LOC
  3. ———- ————— ———-
  4.         10 ACCOUNTING      NEW YORK
  5.         20 RESEARCH        DALLAS
  6.         30 SALES           CHICAGO
  7.         40 OPERATIONS      BOSTON
  8. Elapsed: 00:00:00.00
  9. duzz$scott@orcl>with dept as (select 1 a from dual) select * from dept;
  10.          A
  11. ———-
  12.          1
  13. Elapsed: 00:00:00.00
  14. duzz$scott@orcl>with dept as (select 1 a from dual) delete from dept where a=1;
  15. with dept as (select 1 a from dual) delete from dept where a=1
  16.                                     *
  17. ERROR at line 1:
  18. ORA-00928: missing SELECT keyword
  19. Elapsed: 00:00:00.01
  20. duzz$scott@orcl>with wt1 as (select 1 a, 2 b from dual), wt2 as (select 1 c,3 d from dual) select * from wt1,wt2 where wt1.a=wt2.c;
  21.          A          B          C          D
  22. ———- ———- ———- ———-
  23.          1          2          1          3
  24. Elapsed: 00:00:00.00
  25. duzz$scott@orcl>with wt1 as (select 10 a, 2 b from dual), wt2 as (select deptno,loc from dept,wt1 where deptno=a) select loc from wt2;
  26. LOC
  27. —————————————
  28. NEW YORK
  29. Elapsed: 00:00:00.00
  30. duzz$scott@orcl>
退出移动版