【问题标题】:Create auto-Increment column in resultset PostgreSQL在结果集 PostgreSQL 中创建自动增量列
【发布时间】:2013-03-05 20:00:32
【问题描述】:

这个查询的结果只有在来自path 的订单是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;

【问题讨论】:

标签: postgresql


【解决方案1】:

要保留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;

【讨论】:

  • 是的,这就是我最初的目标。也正如 Wrikken 之前所说 - 这正是我想要的。谢谢!
猜你喜欢
  • 2016-08-19
  • 1970-01-01
  • 2023-04-01
  • 2010-10-21
  • 2013-07-27
  • 2021-10-15
  • 2019-02-10
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多