В моей базе данных есть каталог из 2000 мест, разбросанных по всей территории США, с информацией о почтовом индексе (которую я привязал к координатам lon / lat).
У меня также есть табличная функция, которая принимает два параметра (ZipCode & Miles), чтобы вернуть список соседних почтовых индексов (исключая тот же искомый почтовый индекс)
Для каждого местоположения я пытаюсь получить идентификаторы соседнего местоположения. Таким образом, если у местоположения № 4 есть три соседних местоположения, выходные данные должны выглядеть следующим образом:
- 4 5
- 4 24
- 4 137
То есть местоположения 5, 24 и 137 находятся в пределах X миль от местоположения 4.
Первоначально я пытался использовать перекрестное наложение с моей функцией следующим образом:
SELECT A.SL_STORENUM,A.Sl_Zip,Q.SL_STORENUM FROM tbl_store_locations AS A
CROSS APPLY (SELECT SL_StoreNum FROM tbl_store_locations WHERE SL_Zip in (select zipnum from udf_GetLongLatDist(A.Sl_Zip,7))) AS Q
WHERE A.SL_StoreNum='04'
Однако это длилось более 20 минут безрезультатно, поэтому я отменил его. Я попробовал жесткое кодирование в почтовом индексе, и он сразу же возвратил список
SELECT A.SL_STORENUM,A.Sl_Zip,Q.SL_STORENUM FROM tbl_store_locations AS A
CROSS APPLY (SELECT SL_StoreNum FROM tbl_store_locations WHERE SL_Zip in (select zipnum from udf_GetLongLatDist('12345',7))) AS Q
WHERE A.SL_StoreNum='04'
Каков наиболее эффективный способ составления списка ближайших мест? Учитывая, что в качестве примера я использовал «04», я хочу провести анализ для 2000 местоположений.
«udf_GetLongLatDist» - это функция, которая использует математические вычисления для вычисления расстояния между двумя географическими координатами и возвращает список почтовых индексов с расстоянием> 0. Ничего особенного в этом нет.