Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105041
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2018-05-23 12:43
文章分类

全部博文(41)

文章存档

2016年(2)

2015年(3)

2014年(16)

2013年(20)

分类: Oracle

2013-11-22 13:13:19

搭建环境:
CREATE TABLE departments (
  deptid INT,
  deptname VARCHAR(20),
  empcount INT,
  superdept INT
)
insert into departments(deptid,deptname,empcount,superdept)values(1,'Production',20,0);
insert into departments(deptid,deptname,empcount,superdept)values(2,'ProdA',20,1);
insert into departments(deptid,deptname,empcount,superdept)values(3,'ProdB',20,1);
insert into departments(deptid,deptname,empcount,superdept)values(4,'ProdA1',20,2);
insert into departments(deptid,deptname,empcount,superdept)values(5,'ProdA2',20,2);


Oracle:
  格式
  Select * from …. Where [结果过滤条件语句]
  Start with  [and起始条件过滤语句]
  Connect by prior [and中间记录过滤条件语句]
查找所有下级
       select * from departments start with deptid=1 connect by prior deptid=superdept;
  注意:此sql能查找deptid=1的数据的所有下级,写sql语句时要注意,因为是从deptid=1开始查找下级,所以connect by    prior 子句的条件是deptid=superdept
查找所有上级
      select * from departments start with deptid=5 connect by prior superdept=deptid;
  因为是从deptid=5开始查找上级,所以connect by prior 子句的条件是superdept=deptid


DB2和Oracle通用:    
递归 SQL 在 DB2 中通过公共表表达式 (CTE,Common Table Expression) 来实现。递归 SQL 由递归 CTE 以及对递归 CTE 结果的查询组成。那什么是递归 CTE 呢?简言之,如果 CTE 中的 FULLSELECT 在 FROM 子句中引用到 CTE 本身,就是递归 CTE。递归 CTE 包含以下三个组成部分:
初始查询
初始查询是 CTE 中对基本表进行查询的部分。CTE 定义中的第一个 FULLSELECT 必须不包含对 CTE 自身的应用,即必须是初始查询。
递归查询
递归查询就是通过对 CTE 自身的引用,从而启动递归逻辑的查询。递归查询需要遵循以下几个规则 :
递归查询和初始查询结果必须包含相同数量的数据列;
递归查询和初始查询结果数据列的、长度等必须一致;
递归查询不能包含 GROUP BY 或者 HAVING 子句;
递归查询不能包含 Outer Join;
递归查询不能包含子查询 (Subquery);
递归查询必须用 UNION ALL 联结。
终止条件
终止条件通常是隐性的,即如果前一次递归查询返回的结果集为空,则终止递归;但是也可以在递归查询中设定终止条件,如限定递归查询的深度等。                                                                                  
WITH temptab(deptid, empcount, superdept) AS
   (    SELECT root.deptid, root.empcount, root.superdept
            FROM departments root
            WHERE deptname='Production'
     UNION ALL
        SELECT sub.deptid, sub.empcount, sub.superdept
            FROM departments sub, temptab super
            WHERE sub.superdept = super.deptid
   )
select * from temptab;
阅读(2240) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~