找出表中数据的父子关系,oracle提供了start with connect by prior函数来实现递归查询,其基本语法是:
select …… from tablename
where conditional-1
start with conditional-2
connect by prior conditional-3
例1:找到员工miller的所有上级
SELECT level, e.*
FROM empe
STARTWITH ename='miller'
CONNECTBY PRIOR mgr=empno;
结果:
结果表明miller的上司为clark,clark的上司为king。由于king是公司的负责人因此其mgr为null。
例2:如果想要将结果表示为miller-->clark-->king可使用如下语句进行求解。
SELECT LTRIM (SYS_CONNECT_BY_PATH(ename,'-->'),'-->')
leaf__branch_____root
ROM emp
WHERE LEVEL=3
STARTWITH ename='miller'
CONNECTBY PRIOR mgr=empno;
结果:(没有where语句时结果为左图,添加where语句后结果为右图。)
例3:返回整个公司员工的层次关系。
SELECT LTRIM (SYS_CONNECT_BY_PATH(ename,'- '),' - ')emp_tree
FROM emp
STARTWITH mgrISNULL
CONNECTBY PRIOR empno=mgr
ORDER BY 1;
结果:
本例中start with定义了根行,由于king是公司的经理没有上司,因此其mgr字段为null;connect by子句返回了层次中符合条件的行。
例4:对例3中的结果换一种展示方式:
SELECT LPAD ('',LEVEL*2-1) ||SYS_CONNECT_BY_PATH(ename,'=>')
emp_tree
FROM emp
STARTWITH mgrISNULL
CONNECTBY PRIOR empno=mgr;
结果: