【问题标题】:Filtering Oracle 11g Hierarchical Tables过滤 Oracle 11g 分层表
【发布时间】:2014-05-25 15:22:26
【问题描述】:

当过滤应用于 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;

【问题讨论】:

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

标签: sql oracle11g hierarchy


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2023-03-15
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多