如何查询没有子节点的树表结构

时间:2016-04-20 15:24:52

标签: oracle oracle11g

我在Oracle 11g中将数据组织为树。

CREATE TABLE FOLDER
(
  NAME VARCHAR2(20),
  ID NUMBER(10, 0),
  PARENT_ID NUMBER(10, 0)
}

(我认为这种结构很明显,我应该解释一下)。

尝试仅查询没有子文件夹的数据。使用此查询(不确定其正确):

SELECT * FROM folder f WHERE NOT EXISTS ( 
   SELECT *
    FROM folder cf
    WHERE f.id= cf.parent)

是否有可能为此目的使用更优化的查询,例如使用COUNT?

1 个答案:

答案 0 :(得分:4)

您可以使用hierarchical query

select name, id, parent_id from (
  select name, id, parent_id, connect_by_isleaf as isleaf
  from folder
  start with parent_id = parent_id -- from comments
  connect by nocycle parent_id = prior id
)
where isleaf = 1;

内部查询获取层次结构以及使用connect_by_isleaf pseudocolumn设置的标志:

  

如果当前行是CONNECT BY条件定义的树的叶子,则CONNECT_BY_ISLEAF伪列返回1。否则返回0.此信息指示是否可以进一步扩展给定行以显示更多层次结构。

您需要nocycle参数,因为您将父ID设置为与层次结构的顶级行中的ID相同的事实意味着该行本身满足prior条件,造成一个循环。启动条件和nocycle的组合将使其有效。

本质上,它为您提供了整个原始表以及一个带有1或0的额外列。您可以自己运行该内部查询以查看它产生的内容。

您只需查找没有子文件夹的潜在客户节点,因此外部查询会对生成的isleaf列进行过滤,因此您只能查看已离开的列。