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 (编辑:天瑞地安资讯网_黄海网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 将Access数据库迁移到SharePoint 2007
- sql-server – 在IF EXISTS中包装查询使得它非常慢
- sql-server – 为什么我需要两个SQL Server Service Broker
- sql – 如何从SELECT语句的前一个结果行获取值?
- sql-server – 只获取每天TSQL中多个条目的最后一行
- sql-server – 如何在WiX安装程序中检测SQL Server Express
- sql-server – 父子树分层ORDER
- 如何找出SQL Server中使用主键的引用?
- sql中identity自增的方法是什么?
- sql – Oracle 11g:取消激活多列并包含列名


