大家好,我正在尝试使用MSSQL中的地理位置数据来比较客户端与其相应服务器之间的距离。
我能够成功比较两点之间的距离。 但是,仅显示最后一个条目的距离。
这是我正在使用的查询:
Declare @locations1 GEOGRAPHY;
Declare @locations2 GEOGRAPHY;
Declare @ServerID int;
SELECT @locations1 = GeoLoc from [TestDb].[dbo].[Locations] where IsClient =1;
SELECT @ServerID = ServerID from [TestDb].dbo.Locations where IsClient=1;
SELECT @locations2 = GeoLoc from [TestDb].[dbo].[Locations] where IsClient =0 AND id=@ServerID ;
select @locations1.STDistance(@locations2)/1000 As [Distance in KM]
我相信以上查询的工作方式如下:
locations1 -具有IsClient为True的那些列的GeoLocation。
ServerId -具有IsClient为True的列的ServerID。
locations2 -具有IsClient为0的列的GeoLocation和
在上面的查询中获得的ServerId与计算机的ID匹配。
所以,
location1必须具有客户端的地理位置。
location2必须具有相应服务器的地理位置。
我的餐桌设计:
比较时,我得到正确的结果,但是只有表中最后一个客户端和服务器条目之间的距离。 没有显示其他任何条目的距离。
如何获取所有条目的距离? 需要帮助:)。 谢谢。
答案 0 :(得分:2)
看起来您需要执行自我连接,为此您始终需要对表名进行“别名”处理。像
SELECT l1.id,l2.id,l1.serverid, l1.geoloc.STDistance(l2.geoloc)/1000.0 As [Distance in KM] FROM
[TestDb].[dbo].[Locations] l1 JOIN
[TestDb].[dbo].[Locations] l2
ON L1.IsClient = 1 AND L2.isClient = 0 AND L2.id = L1.ServerId
因此,对于每个客户端,将加入l1.ServerId定义的服务器记录
l1和l2是单个表的“别名”