¿Obtiene múltiples rutas más cortas con PgRouting en una consulta?

12

Quiero ejecutar el algoritmo de ruta más corta en múltiples pares de origen y destino a la vez y obtener un resultado como tabla y luego procesarlo.

¿Cómo hago esto? Esta consulta no funciona:

SELECT a.source, a.target, paths.* 
FROM all_to_all a, shortest_path_astar('...', a.source, a.target, false, false) paths;

ERROR:  function expression in FROM cannot refer to other relations of same query level

(por cierto, all_to_all no significa literalmente todo para todos, :) es solo un número de pares aleatorios)

Esto tampoco funciona:

SELECT * 
FROM all_to_all a, (
   SELECT * FROM shortest_path_astar('...', a.source, a.target, false, false) yyy
) AS t2;
culebrón
fuente
---- ¿podría por favor ampliar esto? Tengo el mismo problema pero no puedo resolver estos pares. (de un intento de edición de la publicación)
Mapperz

Respuestas:

13

Algo como

SELECT 
  source, 
  target,
  (SELECT SUM(cost) FROM  -- or whatever you want to do with the routing result
     (SELECT * FROM shortest_path_astar('...',
       source,
       target,
       false,
       false)
     ) AS foo 
  ) AS cost
FROM all_to_all;
bajo oscuro
fuente
4

Aquí hay una consulta que devuelve todos los segmentos para todas las combinaciones de origen-destino:

SELECT
    source,
    target,
    shortest_path_astar('SELECT gid AS id, length AS cost, * FROM ways', source, target, false, false) AS segment
FROM
    all_to_all

Increíble, inconsistente con la sintaxis SQL, ¡pero funciona!

source | target | segment
-------+--------+----------------
     1 |      4 | (1, 2, 0.1357)
     1 |      4 | (2, 3, 0.2468)
     1 |      4 | (3, 4, 0.9)
     1 |      4 | (4, -1, 0)
other sources & targets here
culebrón
fuente