我在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?
答案 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
列进行过滤,因此您只能查看已离开的列。