过滤Oracle 11g分层表

时间:2014-05-25 15:22:26

标签: sql oracle11g hierarchy

我在理解何时将过滤应用于Oracle分层表时遇到了一些麻烦。

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

start with mgr is null
connect by nocycle prior emp = mgr;

在同一张表中,我有一个额外的列,用于指定员工的DATE_OF_BIRTH

根据这种情况并保持与此表/查询相同的层次结构特性,如何应用过滤器来仅显示DATE_OF_BIRTH介于1965年和1980年之间的分层数据?

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

where date_of_birth between 1965 and 1980 
start with mgr is null
connect by nocycle prior emp = mgr;

感谢。

1 个答案:

答案 0 :(得分:1)

The documentation在这一点上相当明确:

  

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

     
      
  • 首先评估连接(如果存在),无论是在FROM子句中还是在WHERE子句谓词中指定了连接。

  •   
  • 评估CONNECT BY条件。

  •   
  • 评估剩余的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;