在结果集PostgreSQL中创建自动增量列

只有来自path的顺序是preserver时,此查询的结果才有意义.但是,在我的Left Inner Join中,结果是混乱的.我想我可以在结果集中创建一个新列,就像结果的索引一样,然后作为整个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,v0prt FROM network_link) as network_link 
    ON (network_link.gid=path.edge_id)
ORDER BY idx;

解决方法

要保留shortest_path_shooting_star返回的顺序(如果不提供其他方法),可以使用窗口函数row_number来跟踪原始顺序,并按顺序查看其结果:

SELECT path.*,network_link.v0prt
    FROM (SELECT row_number() OVER() AS row_number,*
        FROM shortest_path_shooting_star(
        'SELECT gid as id,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,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;

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...