Sql 沿系统路径连接的总距离
参考SO上的问题,输入图表为-Sql 沿系统路径连接的总距离,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,参考SO上的问题,输入图表为- P_FROM P_TO DISTANCE A B 4 A C 7 B C 10 C D 15 B D 17 A D 23 B E 22 C E 29 预期的答案是—— P_
P_FROM P_TO DISTANCE
A B 4
A C 7
B C 10
C D 15
B D 17
A D 23
B E 22
C E 29
预期的答案是——
P_FROM P_TO FULL_ROUTE TOTAL_DISTANCE
A E A->B->E 26
A E A->C->E 36
A E A->B->C->E 43
答案中给出的查询正在成功检索结果-
WITH multiroutes (p_from, p_to, full_route, total_distance)
AS (SELECT p_from,
p_to,
p_from || '->' || p_to full_route,
distance total_distance
FROM graph
WHERE p_from LIKE 'A'
UNION ALL
SELECT M.p_from,
n.p_to,
M.full_route || '->' || n.p_to full_route,
M.total_distance + n.distance total_distance
FROM multiroutes M JOIN graph n ON M.p_to = n.p_from
WHERE n.p_to <> ALL (M.full_route))
SELECT *
FROM multiroutes
WHERE p_to LIKE 'E'
ORDER BY p_from, p_to, total_distance ASC;
输出-
P_FROM P_TO FULL_ROUTE TOTAL_DISTANCE
A E A->B->E 22
A E A->C->E 29
A E A->B->C->E 29
我尝试了类似答案中给出的查询,但这对我也没有多大帮助。是否只有使用ORACLE特定语法才能获得正确的总距离
是供您参考的小提琴。您几乎完成了-您的问题是只输出最后一步的距离 使用
+
将表达式或总距离连接起来,然后按照建议使用xmlquery
对其求值
这给出了预期的结果,尽管我想知道是否有更简单的解决方案
P_FROM, P_TO, FULL_ROUTE, TOTAL_DISTANCE_EXPR, TOTAL_DISTANCE
A E A->B->E +4+22 26
A E A->C->E +7+29 36
A E A->B->C->E +4+10+29 43
没有比这更好的方法了吗?不确定@AnkitBajpai只支持字符数据,所以不能执行加法。您选择的递归子查询分解似乎还可以。
with dist as (
SELECT CONNECT_BY_ROOT(P_FROM) P_FROM
,P_TO
,CONNECT_BY_ROOT(P_FROM) || SYS_CONNECT_BY_PATH(P_TO, '->') FULL_ROUTE
,DISTANCE TOTAL_DISTANCE,
SYS_CONNECT_BY_PATH(DISTANCE,'+') total_distance_expr
FROM graph
WHERE P_TO = 'E'
START WITH P_FROM = 'A'
CONNECT BY PRIOR P_TO = P_FROM)
select P_FROM, P_TO, FULL_ROUTE, TOTAL_DISTANCE_EXPR
,xmlquery(TOTAL_DISTANCE_EXPR returning content).getNumberVal() as TOTAL_DISTANCE
from dist
ORDER BY P_FROM, P_TO, TOTAL_DISTANCE ASC;
P_FROM, P_TO, FULL_ROUTE, TOTAL_DISTANCE_EXPR, TOTAL_DISTANCE
A E A->B->E +4+22 26
A E A->C->E +7+29 36
A E A->B->C->E +4+10+29 43