Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 沿系统路径连接的总距离_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 沿系统路径连接的总距离

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_

参考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_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