【问题标题】:How to stop at a specific branch/level in an Oracle Tree Hierarchy?如何在 Oracle 树层次结构中的特定分支/级别停止?
【发布时间】:2013-11-01 04:12:33
【问题描述】:

鉴于 Oracle 11gr2 中的以下树层次结构示例:

查询:

SELECT Lpad(ename,Length(ename) + LEVEL * 10 - 10,'-') 
FROM   emp 
START WITH mgr IS NULL 
CONNECT BY PRIOR empno = mgr


Result:


KING
----------JONES
--------------------SCOTT
------------------------------ADAMS
--------------------FORD
------------------------------SMITH
----------BLAKE
--------------------ALLEN
--------------------WARD
--------------------MARTIN
--------------------TURNER
--------------------JAMES
----------SAM
--------------------MILLER

我需要修剪我的树查询,以便每当 ename 以字符“S”、i.e. substr(ename,1,1) = 'S' 开头时,显示此值/分支,但随后忽略低于该值的所有内容,即在此级别之后不再显示任何内容。

因此,基于上述结果样本,新的结果样本将如下所示:

New Result:

KING
----------JONES
--------------------SCOTT
--------------------FORD
------------------------------SMITH
----------BLAKE
--------------------ALLEN
--------------------WARD
--------------------MARTIN
--------------------TURNER
--------------------JAMES
----------SAM

因此,子“ADAMS”和“MILLER”已从新结果中删除。

【问题讨论】:

    标签: sql oracle plsql tree oracle11g


    【解决方案1】:
    SELECT Lpad(ename,Length(ename) + LEVEL * 10 - 10,'-') 
    FROM   emp 
    START WITH mgr IS NULL 
    CONNECT BY PRIOR empno = mgr and substr(PRIOR ename,1,1) <> 'S';
    

    或者如果你想使用Recursive subquery factoring:

    with employees(empno, ename, mgr, emp_level) as
    (
        select empno, ename, mgr, 1 emp_level
        from emp
        where mgr is null
        union all
        select emp.empno, emp.ename, emp.mgr, emp_level+1 emp_level
        from emp
        join employees
            on emp.mgr = employees.empno
        where substr(employees.ename,1,1) <> 'S'
    ) search depth first by empno set order1
    select Lpad(ename,Length(ename) + emp_level * 10 - 10,'-')
    from employees
    order by order1;
    

    SQL Fiddle

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多