当前位置:  数据库>oracle

WITH子句:子查询命名

    来源: 互联网  发布时间:2017-05-04

    本文导语: WITH子句是SQL-99标准的内容,在Oracle9.2中被引入。WITH子句可以用来命名子查询。当子查询在多个地方被使用时,可以直接使用查询名。该子句命名的子查询会被优化器当成内联视图或临时表对待。后一种情况可以提高查询效率。...

WITH子句是SQL-99标准的内容,在Oracle9.2中被引入。WITH子句可以用来命名子查询。当子查询在多个地方被使用时,可以直接使用查询名。该子句命名的子查询会被优化器当成内联视图或临时表对待。后一种情况可以提高查询效率。
 
使用SCOTT模式,对于每名员工取得他所在部门的人数,使用内联视图可以实现如下:
SELECT e.ename AS employee_name,
       dc.dept_count AS emp_dept_count
FROM   emp e,
       (SELECT deptno, COUNT(*) AS dept_count
        FROM   emp
        GROUP BY deptno) dc
WHERE  e.deptno = dc.deptno;
 
使用WITH子句,可以实现如下:
WITH dept_count AS (
  SELECT deptno, COUNT(*) AS dept_count
  FROM   emp
  GROUP BY deptno)
SELECT e.ename AS employee_name,
       dc.dept_count AS emp_dept_count
FROM   emp e,
       dept_count dc
WHERE  e.deptno = dc.deptno;
 
需求稍微变得复杂,现在在取得每名员工所在部门人数的同时,还要取得该员工的经理及其经理所在部门的人数。使用内联视图实现如下:
SELECT e.ename AS employee_name,
       dc1.dept_count AS emp_dept_count,
       m.ename AS manager_name,
       dc2.dept_count AS mgr_dept_count
FROM   emp e,
       (SELECT deptno, COUNT(*) AS dept_count
        FROM   emp
        GROUP BY deptno) dc1,
       emp m,
       (SELECT deptno, COUNT(*) AS dept_count
        FROM   emp
        GROUP BY deptno) dc2
WHERE  e.deptno = dc1.deptno
AND    e.mgr = m.empno
AND    m.deptno = dc2.deptno;
 
使用WITH子句实现如下:
WITH dept_count AS (
  SELECT deptno, COUNT(*) AS dept_count
  FROM   emp
  GROUP BY deptno)
SELECT e.ename AS employee_name,
       dc1.dept_count AS emp_dept_count,
       m.ename AS manager_name,
       dc2.dept_count AS mgr_dept_count
FROM   emp e,
       dept_count dc1,
       emp m,
       dept_count dc2
WHERE  e.deptno = dc1.deptno
AND    e.mgr = m.empno
AND    m.deptno = dc2.deptno;
 
显然,使用WITH子句结构更简洁,使用内联视图时出现两次的子查询,在使用WITH子句时只出现一次。
 
在没有重复子查询出现的情况下,也可以使用WITH子句简化复杂查询。下面的例子列出了所有开支大于平均开支的部门。
WITH
  dept_costs AS (
    SELECT dname, SUM(sal) dept_total
    FROM   emp e, dept d
    WHERE  e.deptno = d.deptno
    GROUP BY dname),
  avg_cost AS (
    SELECT SUM(dept_total)/COUNT(*) avg
    FROM   dept_costs)
SELECT *
FROM   dept_costs
WHERE  dept_total > (SELECT avg FROM avg_cost)
ORDER BY dname;
 
上面的查询,主体部分很简单,复杂的逻辑隐藏在了WITH子句中。
 
综上所述,该子句主要用来简化查询,增强语句可读性,提高查询效率。











































































    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle层次查询和with函数的使用示例
  • sql递归查询(with cte实现)
  • C++ I/O 成员 sync_with_stdio():同标准I/O同步
  • Tab插件 Floating Window with Tabs
  • C++ Double Ended Queues 成员 swap():swap one dequeue with another
  • Console.log with style
  • 照片墙 Image Wall with jQuery
  • Python with的用法
  • 打开FC3_with_SER出现的提示
  • 关于lamp的配置,--with-apxs2参数问题,在线
  • AJAX-enabled Sticky Notes With PHP & jQuery
  • HTML5 File Uploads with jQuery
  • Simple-Drawing-App-with-Bucket-Tool
  • git 分支操作可视化展示 explain-git-with-d3
  • Form Validation with Hints
  • Horizontal Scroll Menu with jQuery
  • 请问那能下载《Use case driven object modeling with UML》
  • sqlserver iis7站长之家
  • ubuntu桌面版安装时,失败,提示:Extraction failed with code:2
  • What's wrong with the Mozilla?
  • Codeigniter出现错误提示Error with CACHE directory的解决方案
  • gtk_tree_view_column_new_with_attributes设置的title不显示..
  • Scroll your HTML with jquery.scrollable


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,