Oracle递归查询

Oracle的递归查询是一个很实用的功能,它可以通过一个节点去查询其所有父节点或者的值。

它的语法结构如下:

SQL
select * from tablename where 条件4 start with 条件1 connect by 条件2 AND 条件3

递归查询有三点要注意的地方

  1. 递归查询的Where语言在递归查询之后执行。在查询时要注意逻辑删除的数据,逻辑删除的条件应该加在star条件和conntect by条件里,而不是后面的Where语句里。
  2. 在conntect by条件里,用prior来指定本节点的列名,没用prior指定的列名表示父节点或者子节点的列名。
  3. 在Where语句里,用LEVEL来表示递归层数,LEVEL的计数从1开始,Start检索出来的数据LEVEL为1。

比如以下表(为了说明的可读性,我把职位用汉字表示了,一般情况应该用编号。)

SQL
CREATE TABLE T_EMPLOYEE (
    ID NUMBER(9) NOT NULL,
    NAME VARCHAR2(255) NULL,
    POSITION VARCHAR2(255) NULL,
    MANAGER_POSITION VARCHAR2(255) NULL,
    DEL_FLG CHAR(1) NULL,
    PRIMARY KEY(ID)
);

Insert into T_EMPLOYEE values(1, '赵大', '总经理', null, '1');
Insert into T_EMPLOYEE values(2, '赵二', '总经理', null, '0');
Insert into T_EMPLOYEE values(3, '张二', '人事部门经理', '总经理', '1');
Insert into T_EMPLOYEE values(4, '张三', '人事部门经理', '总经理', '0');
Insert into T_EMPLOYEE values(5, '李四', '财务部门经理', '总经理', '0');
Insert into T_EMPLOYEE values(6, '刘五', '员工', '人事部门经理', '0');
Insert into T_EMPLOYEE values(7, '王六', '员工', '人事部门经理', '0');
Insert into T_EMPLOYEE values(8, '钱七', '员工', '人事部门经理', '1');
Insert into T_EMPLOYEE values(9, '林八', '员工', '财务部门经理', '0');

查询现在由总经理直接管理的人的SQL文如下:

SQL
select * from T_EMPLOYEE
where LEVEL = 2
start with POSITION = '总经理' and DEL_FLG = '0'
connect by MANAGER_POSITION = prior POSITION and DEL_FLG = '0'

转载请注明:宇托的狗窝 » Oracle递归查询

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址