我在理解何时将过滤应用于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;
感谢。
答案 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;