Невозможно обойти тот факт, что вам придется сравнивать каждую запись в A с каждой записью в B, что, очевидно, будет плохо масштабироваться, если и A, и B содержат много записей.
При этом это вернет правильные результаты:
SELECT aid, bid, distanceAB
FROM (
SELECT aid, bid, distanceAB,
dense_rank() over (partition by aid order by distanceAB) as n
FROM (
SELECT a.id as aid, B.id as bid,
acos(sin(radians(A.lat)) * sin(radians(B.lat)) +
cos(radians(A.lat)) * cos(radians(B.lat)) *
cos(radians(A.lon - B.lon))) * 6372.8 as distanceAB
FROM A cross join B
) C
) D
WHERE n = 1
Это вернется через разумное количество времени, если ваши сеты не слишком велики.С 3 местоположениями в A и 130 000 или около того в B, это займет около одной секунды на моей машине.1000 записей в каждой занимает около 40 с.Как я уже сказал, он плохо масштабируется.
Следует отметить, что ответ Спарки может давать неверные результаты при определенных обстоятельствах.Предположим, ваше местоположение А находится на + 40, + 100.+ 40, + 111 не будет возвращено, даже если оно ближе, чем + 49, + 109.