6

このクエリの結果は、order frompathが preserver である場合にのみ意味があります。ただし、左内側の結合では、結果がスクランブルされます。結果セットに結果のインデックスのような新しい列を作成し、SQL全体の最後の句としてORDER BY idx.

これは、最終的な順序を維持しようとしない私のクエリです:

SELECT path.*, network_link.v0prt
    FROM (SELECT *                              // Need order preserved from this one
        FROM shortest_path_shooting_star(
        'SELECT gid as id, source::integer,
        target::integer, distance::double precision as cost,
        x1, y1, x2, y2, rule, to_cost FROM
            network_link as net ORDER BY net.gid', 9, 1, false, false)) as path
    LEFT OUTER JOIN 
    (SELECT DISTINCT gid, v0prt FROM network_link) as network_link 
    ON (network_link.gid=path.edge_id);

どんな洞察も素晴らしいでしょう。

ありがとう。そして、インデックス値と ORDER BY を追加しようとしました(これは機能しません)。

SELECT path.*, network_link.v0prt
    FROM (SELECT incr(0) as idx, * 
        FROM shortest_path_shooting_star(
        'SELECT gid as id, source::integer,
        target::integer, distance::double precision as cost,
        x1, y1, x2, y2, rule, to_cost FROM
            network_link as net ORDER BY net.gid', 9, 1, false, false)) as path
    LEFT OUTER JOIN 
    (SELECT DISTINCT gid, v0prt FROM network_link) as network_link 
    ON (network_link.gid=path.edge_id)
ORDER BY idx;
4

1 に答える 1

11

によって返された順序を保持するにはshortest_path_shooting_star(他に方法がない場合)、ウィンドウ関数を使用して元の順序とその結果row_numberを追跡できます。ORDER BY

SELECT path.*, network_link.v0prt
    FROM (SELECT row_number() OVER() AS row_number, *
        FROM shortest_path_shooting_star(
        'SELECT gid as id, source::integer,
        target::integer, distance::double precision as cost,
        x1, y1, x2, y2, rule, to_cost FROM
            network_link as net ORDER BY net.gid', 9, 1, false, false)) as path
    LEFT OUTER JOIN 
    (SELECT DISTINCT gid, v0prt FROM network_link) as network_link 
    ON (network_link.gid=path.edge_id)
ORDER BY path.row_number;

アップデート:

PostgreSQL バージョン 9.4 以降では、次の方法を使用することをお勧めしますWITH ORDINALITY

SELECT path.*, network_link.v0prt
FROM shortest_path_shooting_star(
        'SELECT gid as id, source::integer,
        target::integer, distance::double precision as cost,
        x1, y1, x2, y2, rule, to_cost FROM
            network_link as net ORDER BY net.gid', 9, 1, false, false)
) WITH ORDINALITY AS path
LEFT OUTER JOIN 
    (SELECT DISTINCT gid, v0prt FROM network_link) as network_link 
    ON (network_link.gid=path.edge_id)
ORDER BY path.ordinality;
于 2013-03-05T22:05:29.127 に答える