Sql 如何使用分层查询获取与条件匹配的行
考虑以下来自Oracle文档的查询 我想筛选此树,以获得姓氏中只有字母“a”的员工。 我可以使用WHERE子句,但问题是我不想只得到符合条件的行,如果它们不符合条件,我也不想得到它们的父事件,也就是说,我不想破坏一棵树。根据文档,Oracle分别评估每行的条件。例如,如果我使用WHERE子句,我会得到ID为101、109、111、112、200的行。但我想得到101108109111112200。Sql 如何使用分层查询获取与条件匹配的行,sql,database,oracle,hierarchical-data,Sql,Database,Oracle,Hierarchical Data,考虑以下来自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.