Метод грубой силы (при условии, что PostGIS поддерживает предложения WITH, и при условии, что у меня правильный синтаксис предложений WITH - оба непроверенных предположения):
WITH (SELECT a.name AS a_name, b.name AS b_name, ST_Distance(a.the_geom, b.the_geom) as distance
FROM a, b -- Cartesian product (not efficient!)
) AS distances
SELECT d1.a_name, d1.b_name, d1.distance
FROM distances AS d1
JOIN (SELECT a_name, MIN(distance) AS distance
FROM distances
GROUP BY a_name) AS d2
Это создает список имен (a_name
и b_name
) плюс соответствующее расстояние, используя декартово произведение (что и делает ваш оригинальный запрос до того, как включится GROUP BY). Затем он выбирает два имени и расстояние от объединения этой таблицы с той же таблицей, сгруппированной по a_name
и объединенной по a_name
и минимальному расстоянию.
Очевидно, что если WITH не поддерживается, вы можете дважды написать предложение WITH и надеяться, что ваш оптимизатор работает хорошо.