Как структурировать запросы множественного выбора ОШИБКА: отношения "rxg" не существует - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь выполнить запрос к моей таблице (ais): так что это подробный подход:

ограничить поиск первым восстановлением: выберите все идентификаторы для точек на расстоянии 200 км, - затем выберите идентификаторы, где расстояние между двумя точками равно 300, а полученный_c одинаков - вернуть те идентификаторы, сгруппированные по _id

SELECT rxg._id 
FROM (
      SELECT *  FROM ais 
      WHERE ST_DWithin(geography(point), 
      ST_SetSRID(ST_MakePoint(-95.0217,29.6111), 4326)::geography, 
      200000)
) 
AS rxg, rxg AS b
WHERE ST_DWITHIN (rxg.point, b.point, 300) 
AND rxg._id != b._id
AND rxg.received_c = b.received_c
GROUP BY _id
;

1 Ответ

0 голосов
/ 08 сентября 2018

Я думаю, у вас проблема в том, что вы пытаетесь использовать один подзапрос дважды, но вы не можете этого сделать. Вместо этого попробуйте здесь использовать общее табличное выражение (CTE), которое дважды вставит код для этого подзапроса:

WITH cte AS (
    SELECT *
    FROM ais 
    WHERE ST_DWithin(geography(point), 
        ST_SetSRID(ST_MakePoint(-95.0217,29.6111), 4326)::geography, 
        200000)
)

SELECT rxg._id
FROM cte rxg
INNER JOIN cte b
    ON rxg._id != b._id AND
       rxg.received_c = b.received_c
WHERE ST_DWITHIN (rxg.point, b.point, 300)
GROUP BY rxg._id;

Обратите внимание, что я заменил ваше неявное соединение старой школы неявным внутренним соединением. Это предпочтительный способ объединения таблиц со стандарта ANSI-92.

...