更新:使用COALESCE / IFNULL过滤递归cte查询

时间:2017-12-24 09:07:44

标签: sql postgresql common-table-expression recursive-query

我有一个过滤/添加条件到递归CTE查询以避免NULL结果的问题。查询的递归部分一旦遇到从第一个非递归查询中获取的降序系列gid中的间隙就停止循环(基本上当x.t_gid = s.g2_t_gid中的WHERE过滤器为NULL时)。

x.t_gid和s.g2_t_gid正在降序系列的整数,而x.t_gid(n)= s.g2_t_gid(n + 1)。系列中应该有差距gids但我希望递归部分只是继续到下一行,如果它返回NULL结果。请参阅下面的代码。

WITH RECURSIVE snapped_points(t_gid, r_rdname, r_gid, r_ufi, snapped_geom, snapped_distance, g2_t_gid, g2_r_rdname, s_g2_snapped_geom, route_distance) AS (

(SELECT t_gid, 
    r_rdname,
    r_gid,
    r_ufi,
    snapped_geom AS snapped_geom,
    snapped_distance,
    g2_t_gid,
    g2_r_rdname,
    g2_snapped_geom AS s_g2_snapped_geom,
    route_distance
FROM x_joined_snapped x
LIMIT 1)

UNION ALL

(SELECT x.t_gid, 
    x.r_rdname,
    x.r_gid,
    x.r_ufi,
    x.snapped_geom,
    x.snapped_distance,
    x.g2_t_gid,
    x.g2_r_rdname,
    x.g2_snapped_geom,
    x.route_distance
FROM snapped_points s
INNER JOIN x_joined_snapped x
ON x.t_gid <> s.t_gid
AND (x.t_gid = s.g2_t_gid AND x.snapped_geom = s.s_g2_snapped_geom)
--OR (x.t_gid < s.g2_t_gid),  <-- difference between 1s and 24s**
LIMIT 1
)
)
SELECT  t_gid, r_gid, r_ufi, r_rdname, snapped_distance, snapped_geom FROM snapped_points
;

我的目标是什么。

  1. 从t_gid(n)的潜在捕捉点数组中,选择snapped_geom(n)和g2_snapped_geom(n)之间的距离最短的行。如果只有1个结果选择那个。
  2. 来自t_gid(n-1)的潜在快照点数组(等于 g2_t_gid(n)),选择仅包含上一步中选择的g2_snapped_geom(n)的子集。
  3. 从此子集中,选择snapped_geom(n-1)和g2_snapped_geom(n-1)之间的距离最短的行。如果只有1选择那个。附加到上一个结果。循环直到你的行用完为止。
  4. 一旦递归部分遇到表x.t_gid <> s.g2_t_gid中的间隙,它就会停止循环。我已经能够通过向OR x.t_gid < s.g2_t_gid子句添加WHERE来解决此问题,但这会将计算时间从1000毫秒增加到24,000毫秒。

    我已尝试使用COALESCE但无法使其工作,并且递归CTE查询不允许在查询中重复递归部分。

    我是一个完整的菜鸟,所以我确信这个代码可以变得更漂亮,更高效。任何帮助将不胜感激。

0 个答案:

没有答案