我有一个数据库,其中from_node
和to_node
是列。尝试查找从from_node
到to_node
的所有可达节点。有循环。很少有from_node
使用connect by nocycle
,正在生成数百万个子节点。如何解决这一问题?
SELECT from_node,
to_node,
level
FROM PATH
START WITH from_node = input_var
CONNECT BY NOCYCLE PRIOR to_node= from_node;
1条答案
按热度按时间zsbz8rwp1#
根据您的描述,我可能会考虑使用递归子查询分解子句,而不是分层查询。这将更容易让你摆脱周期。这是因为NOCYCLE实际上并不停止周期,而是阻止Oracle关心它们。这是Oracle文档的摘录:
NOCYCLE参数指示Oracle数据库从查询中返回行,即使数据中存在CONNECT BY循环。将此参数与CONNECT_BY_ISCYCLE伪列沿着使用,以查看哪些行包含循环。有关详细信息,请参阅CONNECT_BY_ISCYCLE伪列。
像这样的递归子查询可能更适合你:
这里是一个SQLFiddle与此解决方案(链接)。
这将允许您在给定路径中检测到循环时停止递归。然而,由于在不同的路径上可以找到相同的路径段,因此仍然可能存在重复的往返节点,因此我添加了分组以仅显示最低级别,因为这是到达给定节点的最佳方式。