sql – 使用递归查询访问有向图,就好像它是一个无向图
>使用字符串记录路径.比行数组更小更快.仍包含所有必要信息.但是,可能会使用非常大的bigint数字进行更改. 原始查询中的问题: WHERE (g.parent = o.child or g.child = o.parent) 在此过程中的任何一点只有一个遍历端点.当您在两个方向上拖动有向图时,端点可以是父节点或子节点 – 但不是两者都可以.您必须保存每个步骤的端点,然后: WHERE g.child IN (o.parent,o.child) 违反指示也会使您的起始条件有问题: WHERE parent = 1 必须是 WHERE 1 IN (parent,child) 并且这两行(1,2)和(2,1)实际上是重复的…… 评论后的补充解决方案 >忽略方向 注意,这种方式(2,1)和(1,2)是有效的重复,但两者都可以在同一路径中使用. 我介绍了列叶,它保存了每一步的实际终点. WITH RECURSIVE graph AS ( SELECT CASE WHEN parent = 1 THEN child ELSE parent END AS leaf,ARRAY[ROW(parent,child)] AS path,0 AS depth FROM ownership WHERE 1 in (child,parent) UNION ALL SELECT CASE WHEN o.parent = g.leaf THEN o.child ELSE o.parent END -- AS leaf,path || ROW(o.parent,o.child) -- AS path,depth + 1 -- AS depth FROM graph g JOIN ownership o ON g.leaf in (o.parent,o.child) AND ROW(o.parent,o.child) <> ALL(path) ) SELECT * FROM graph (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |