oracle with的用法

 

转贴:http://database.51cto.com/art/201010/231528.htm

Oracle数据库中,使用with语句可以实现子查询,提高语句执行的效率,下文对with语句的用法作了详细的介绍,供您参考学习。

AD:

 

Oracle with语句是经常可以见到的语句,下面就为您详细介绍Oracle with语句的用法,如果您对Oracle with语句感兴趣的话,不妨一看。

当查询中多次用到某一部分时,可以用Oracle with语句创建一个公共临时表。因为子查询在内存临时表中,避免了重复解析,所以执行效率会提高不少。临时表在一次查询结束自动清除。

一般语法格式:

 
  
  1. with   
  2. alias_name1 as    (subquery1),  
  3. alias_name2 as    (subQuery2),  
  4. ……  
  5. alias_nameN as    (subQueryN)  
  6. select col1,col2…… col3   
  7.      from alias_name1,alias_name2……,alias_nameN 

Oracle with语句的例子:

 
  
  1. SQL> WITH  
  2. Q1 AS (SELECT 3 + 5 S FROM DUAL),  
  3.     Q2 AS (SELECT 3 * 5 M FROM DUAL),  
  4.     Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)  
  5. SELECT * FROM Q3; 

输出结果:

 
  
  1. S M S+M S*M  
  2. ---------- ---------- ---------- ----------  
  3. 8 15 23 120  
  4.  

 

Oracle的`WITH RECURSIVE`可以用于执行递归查询。以下是使用`WITH RECURSIVE`的基本语法: ``` WITH RECURSIVE cte_name (column1, column2, ...) AS ( -- 初始查询 SELECT column1, column2, ... FROM table_name WHERE condition UNION ALL -- 递归查询 SELECT column1, column2, ... FROM table_name JOIN cte_name ON join_condition WHERE condition ) -- 最终查询 SELECT column1, column2, ... FROM cte_name WHERE condition; ``` 其,`cte_name`是递归查询的名称,`column1, column2, ...`是要选择的列名,`table_name`是要查询的表名,`condition`是查询条件。初始查询和递归查询的结构相同,但它们的条件不同。在递归查询,`JOIN`子句连接递归查询和前一次查询结果。最终查询从递归查询选择所需的列,并应用最终条件。 以下是一个简单的例子,使用`WITH RECURSIVE`查询一个组织结构的层次结构: ``` WITH RECURSIVE org_chart (employee_id, full_name, manager_id, level) AS ( -- 初始查询 SELECT e.employee_id, e.first_name || ' ' || e.last_name, e.manager_id, 1 FROM employees e WHERE e.manager_id IS NULL UNION ALL -- 递归查询 SELECT e.employee_id, e.first_name || ' ' || e.last_name, e.manager_id, c.level + 1 FROM employees e JOIN org_chart c ON e.manager_id = c.employee_id ) -- 最终查询 SELECT employee_id, full_name, manager_id, level FROM org_chart ORDER BY level, full_name; ``` 在这个例子,我们使用`employees`表来表示组织结构。我们从没有经理的员工开始(初始查询),然后递归查询所有员工的层次结构。最终查询从递归查询选择所需的列,并按层次结构和姓名排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值