Sql 筛选Oracle 11g分层表

Sql 筛选Oracle 11g分层表,sql,oracle11g,hierarchy,Sql,Oracle11g,Hierarchy,我在理解将筛选应用于Oracle分层表时遇到了一些问题 我基本上有一个表,它使用EMP/MGR结构,使用如下查询: start with mgr is null connect by nocycle prior emp = mgr; 在同一个表中,我有一个额外的列,指定员工的出生日期 基于此场景并保持此表/查询的相同层次结构性质,我如何应用过滤器,在出生日期在1965年和1980年之间的情况下,仅显示层次结构数据 这只是START WITH子句之前的正常WHERE条件,还是需要成为START

我在理解将筛选应用于Oracle分层表时遇到了一些问题

我基本上有一个表,它使用
EMP/MGR
结构,使用如下查询:

start with mgr is null
connect by nocycle prior emp = mgr;
在同一个表中,我有一个额外的列,指定员工的出生日期

基于此场景并保持此表/查询的相同层次结构性质,我如何应用过滤器,在出生日期在1965年和1980年之间的情况下,仅显示层次结构数据

这只是START WITH子句之前的正常WHERE条件,还是需要成为
START WITH/CONNECT By子句的一部分

where date_of_birth between 1965 and 1980 
start with mgr is null
connect by nocycle prior emp = mgr;
这一点相当明确:

Oracle按如下方式处理分层查询:

  • 首先计算联接(如果存在),无论该联接是在FROM子句中指定的,还是使用WHERE子句谓词指定的

  • 将评估“连接方式”条件

  • 任何剩余的WHERE子句谓词都将被计算

如何使用这些信息取决于您希望如何计算层次结构。如果您想使用所有经理和员工创建树,然后过滤掉您不想显示的人员,那么您目前的做法是正确的

如果要确保将那些出生日期不在该日期范围内的人排除在层次结构计算之外,则必须首先在子查询中进行筛选

 select ...
   from ( select ... from ... where year_of_birth not between 1965 and 1980 )
  start with mgr is null
connect by nocycle prior emp = mgr;

我建议您在数据上尝试两种方法,看看哪种方法返回您想要的结果。