Вот моя загадка запроса: - У меня есть таблица клиентов с долготой и широтой для их почтового индекса. - У меня есть таблица поставщиков с указанием долготы и широты их почтовых индексов. - Отсутствуют связи между таблицами. - У меня есть определяемая пользователем функция, которая вычисляет расстояние между двумя наборами долготы и широты.
У меня есть следующий запрос, который может показать (до) трех ближайших поставщиков в радиусе 50 миль для данного клиента (dbo.latlngdistance — это определяемая пользователем функция):
select top 3 dname1, dcity, dstate, dzip, dbo.latlngdistance(dlr.latitude, dlr.longitude,
(select lat from homeowner where ho_identifier = 16),
(select lng from homeowner where ho_identifier = 16)) AS SortDistance
from dlr
where dbo.latlngdistance(dlr.latitude, dlr.longitude,
(select lat from homeowner ho_identifier = 16),
(select lng from homeowner where ho_identifier = 16)) between 0 and 50
Order By SortDistance
У меня есть еще один запрос, который возвращает всех поставщиков в радиусе 50 миль от всех клиентов (я ограничил количество клиентов в этом примере, потому что производительность этого запроса ужасна):
select ho.ho_identifier, ho.ho_firstname, ho.ho_lastname, ho.ho_email, dname1, dcity, dstate, dzip
from dlr
cross join homeowner ho
where dbo.latlngdistance(dlr.latitude, dlr.longitude,
(select lat from homeowner ho2 where ho.ho_identifier = ho2.ho_identifier),
(select lng from homeowner ho3 where ho.ho_identifier = ho3.ho_identifier)) between 0 and 50
and ho.ho_identifier in (16, 17, 18, 19, 20)
Order By ho.ho_identifier
Итак, мой вопрос: как мне получить (до) трех ближайших поставщиков в радиусе 50 миль для всех клиентов?