Sql 如何使用分层查询获取与条件匹配的行

Sql 如何使用分层查询获取与条件匹配的行,sql,database,oracle,hierarchical-data,Sql,Database,Oracle,Hierarchical Data,考虑以下来自Oracle文档的查询 我想筛选此树,以获得姓氏中只有字母“a”的员工。 我可以使用WHERE子句,但问题是我不想只得到符合条件的行,如果它们不符合条件,我也不想得到它们的父事件,也就是说,我不想破坏一棵树。根据文档,Oracle分别评估每行的条件。例如,如果我使用WHERE子句,我会得到ID为101、109、111、112、200的行。但我想得到101108109111112200。 如何在不破坏树的情况下过滤树?作为一种方法,您可以从下往上遍历树-您可以找到一名员工,他的名字中有

考虑以下来自Oracle文档的查询

我想筛选此树,以获得姓氏中只有字母“a”的员工。 我可以使用WHERE子句,但问题是我不想只得到符合条件的行,如果它们不符合条件,我也不想得到它们的父事件,也就是说,我不想破坏一棵树。根据文档,Oracle分别评估每行的条件。例如,如果我使用WHERE子句,我会得到ID为101、109、111、112、200的行。但我想得到101108109111112200。
如何在不破坏树的情况下过滤树?

作为一种方法,您可以从下往上遍历树-您可以找到一名员工,他的名字中有一个
a
,然后向上遍历树:

Distinct
子句用于消除重复的父级,我们需要第二个
connectby
子句来颠倒树

 -- sample of data from your question
 with t1(EMPLOYEE_ID,LAST_NAME,MANAGER_ID) as(
   select 101, 'Kochhar'   ,  100 from dual union all
   select 108, 'Greenberg' ,  101 from dual union all
   select 109, 'Faviet'    ,  108 from dual union all
   select 110, 'Chen'      ,  108 from dual union all
   select 111, 'Sciarra'   ,  108 from dual union all
   select 112, 'Urman'     ,  108 from dual union all
   select 113, 'Popp'      ,  108 from dual union all
   select 200, 'Whalen'    ,  101 from dual
 )
-- actual query 
select employee_id
      , manager_id
      , concat(lpad('-', 3*level, '-'), last_name) as last_name
  from (
        -- using distinct to get rid of duplicate parents 
        select distinct last_name 
              , employee_id
              , manager_id
          from t1
          start with last_name like '%a%'
         connect by   employee_id  =  prior manager_id 
     ) q
   start with manager_id = 100
 connect by prior employee_id = manager_id
结果:

  EMPLOYEE_ID MANAGER_ID LAST_NAME           
----------- ---------- --------------------
        101        100 ---Kochhar          
        108        101 ------Greenberg     
        109        108 ---------Faviet     
        111        108 ---------Sciarra    
        112        108 ---------Urman      
        200        101 ------Whalen        

6 rows selected.
  EMPLOYEE_ID MANAGER_ID LAST_NAME           
----------- ---------- --------------------
        101        100 ---Kochhar          
        108        101 ------Greenberg     
        109        108 ---------Faviet     
        111        108 ---------Sciarra    
        112        108 ---------Urman      
        200        101 ------Whalen        

6 rows selected.