Как связать этот пост-запрос с подзапросом? - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть запрос на поиск POI вокруг трассировки:

SELECT
      ptb.* AS pois
      FROM traces tr, pois pta, pois ptb
      WHERE tr.id = #{trace.id}
        AND pta.id = #{poi.id}
        AND ST_DWithin(
        ST_LineSubstring(
        tr.path,
        ST_LineLocatePoint(tr.path, pta.lonlat::geometry) + (#{dist} * 1000) / ST_Length(tr.path, false),
        ST_LineLocatePoint(tr.path, pta.lonlat::geometry) + (#{end_point} * 1000) / ST_Length(tr.path, false)
        )::geography,
        ptb.lonlat::geography,
        4000)

Как я могу использовать подзапрос для:
ST_LineLocatePoint(tr.path, pta.lonlat::geometry)
ST_Length(tr.path, false)

РЕДАКТИРОВАТЬ:

   WITH RECURSIVE locate_point_a AS (
      select ST_LineLocatePoint(tr.path, pta.lonlat::geometry) AS locate_point_a
      FROM traces tr, pois pta
      WHERE tr.id = 2
      AND pta.id = 2
      )
  SELECT
    ptb.* AS pois
    FROM traces tr, pois pta, pois ptb, locate_point_a
    WHERE tr.id = 2
      AND pta.id = 2
      AND ST_DWithin(
      ST_LineSubstring(
      tr.path,
      locate_point_a + (25 * 1000) / ST_Length(tr.path, false),
      locate_point_a + (250 * 1000) / ST_Length(tr.path, false)
      )::geography,
      ptb.lonlat::geography,
      4000)
    SQL

1 Ответ

0 голосов
/ 02 ноября 2019

Это должно сделать то же самое (но я не понимаю логику, ТБХ):


SELECT
      ptb.* -- AS pois
FROM  pois ptb
WHERE EXISTS (
      SELECT *
      FROM traces tr
      JOIN pois pta ON ST_DWithin(
                ST_LineSubstring( tr.path
                        , ST_LineLocatePoint(tr.path, pta.lonlat::geometry) + (#{dist} * 1000) / ST_Length(tr.path, false)
                        , ST_LineLocatePoint(tr.path, pta.lonlat::geometry) + (#{end_point} * 1000) / ST_Length(tr.path, false)
                        )::geography
                , ptb.lonlat::geography
                , 4000
                )
      WHERE tr.id = #{trace.id}
        AND pta.id = #{poi.id}
        ;
...