【发布时间】:2012-01-31 21:51:28
【问题描述】:
我的数据库有一个目录,其中包含分布在美国各地的大约 2,000 个地点的邮政编码信息(我已将其与经度/纬度坐标相关联)。
我还有一个表格函数,它接受两个参数(ZipCode 和 Miles)来返回相邻邮政编码的列表(不包括搜索的相同邮政编码)
对于每个位置,我都在尝试获取相邻的位置 ID。因此,如果位置 #4 具有三个附近的位置,则输出应如下所示:
- 4 5
- 4 24
- 4 137
也就是说,位置 5、24 和 137 位于位置 4 的 X 英里范围内。
我最初尝试对我的函数使用交叉应用,如下所示:
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”作为示例,但我想对 2,000 个位置进行分析。
“udf_GetLongLatDist”是一个函数,它使用一些数学计算两个地理坐标之间的距离,并返回一个距离大于 0 的邮政编码列表。其中没有什么花哨的。
【问题讨论】:
-
附注与您的问题没有直接关系,但我们发现邮政编码的质心纬度/经度位置通常与邮政编码中大多数人居住的位置相距甚远。农村邮政编码。所以我们使用了两个位置,邮政编码质心纬度/经度,以及与邮政编码相关的主要城镇/城市的纬度/经度。如果这两个位置中的任何一个位于目标位置的 x 英里范围内,则认为邮政编码就在附近。