计算路段的成本

时间:2018-05-30 03:08:16

标签: sql postgresql algorithm

带路线的表格:

route_id | points 
       1 | [A,B] 
       2 | [L,G,C,F,E]

表格中包含路线段的费用:

route_id | point A | pointB | cost
       1 | A       | B      |   10
       2 | L       | G      |   10
       2 | G       | C      |   20
       2 | C       | F      |   15
       2 | F       | E      |   13

有必要计算route_id = 2中点'G'和'E'之间的成本

1 个答案:

答案 0 :(得分:0)

您可以使用" Recursive With Clause"来实现您想要的结果。

表:

create table test(
route_id int, 
pointA char,
 pointB char, 
 cost int
);

值:

insert into test values(1 ,'A','B',10),
(2 ,'L','G',10),
(2 ,'G','C',20),
(2 ,'C','F',15),
(2 ,'F','E',13)

递归查询:

WITH RECURSIVE routecost AS (
SELECT pointA, pointB ,cost  /* non recursive part */ 
FROM test                   
WHERE pointA = 'G'
  and route_id = 2 
UNION ALL
SELECT b.pointA, a.pointB, a.cost + b.cost   /* recursive part */               
FROM test a                
JOIN routecost b ON(a.pointA = b.pointB)    
  where a.route_id = 2
)
SELECT * FROM routecost
where pointB = 'E'

说明:

  1. 首先使用非递归的pointA和route_id过滤查询 一部分。
  2. 然后在递归部分中加入它,如查询中所示并添加成本
  3. 我每次都会获取b.pointA(非递归部分),因为我们     需要起点。
  4. 然后我最后将其过滤到pointB值以获得所需 结果
  5. Reference: Recursive with clause