【发布时间】:2014-10-09 17:09:23
【问题描述】:
这是我的查询难题: - 我有一张客户表,上面有他们的经度和纬度 邮政编码。 - 我有一张供应商表,也有经度和 他们的邮政编码的纬度。 - 两者之间没有关系 表。 - 我有一个计算距离的用户定义函数 在两组经度和纬度之间。
我有以下查询,可以显示(最多)三个最近的供应商在 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 英里半径范围内最近的三个供应商?
【问题讨论】:
-
尝试创建另一个用户定义的函数或存储过程来循环执行您的第一个查询?
-
我应该提到我被困在 SQL Server 2000 上——我知道,对吧?
-
这很糟糕,有办法通过使用多个连接来实现,但我认为这种方式不是一个好方法......
-
如果您可以将数据库升级到过去十年内制作的内容,您可以使用空间数据类型,它内置支持确定 k 最近邻 (blogs.msdn.com/b/isaac/archive/2008/10/23/…)。
标签: sql sql-server sql-server-2000