使用T-SQL比较两列之间的纬度和经度之间的距离

时间:2018-10-19 08:37:00

标签: sql-server tsql subquery ssms rdbms

大家好,我正在尝试使用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必须具有相应服务器的地理位置。

我的餐桌设计:

enter image description here

比较时,我得到正确的结果,但是只有表中最后一个客户端和服务器条目之间的距离。 没有显示其他任何条目的距离。

如何获取所有条目的距离? 需要帮助:)。 谢谢。

1 个答案:

答案 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是LEFT表,l2是右表。

l1和l2是单个表的“别名”