在SQL Server中,如何在一个距离坐标小于20英里的表中返回值?

Sou*_*ire 3 sql sql-server

这是我一整天都在努力解决的一个非常有趣的问题.我有一张表,其中包含位置的ID,纬度和经度.这是来自更大位置的位置的子集.

我想要做的是使用这个位置子集,并且对于每个位置,使用空中距离返回距离较大集合20英里内的位置.我的问题不是计算空中距离,这是有效的,我的问题是如何像For循环一样操作每一行,但使用基于集合的方法.

所以我们假设这是我的子集表LocationSubset

+----+---------+----------+
| ID |   Lat   |    Lon   |
+----+---------+----------+
| 1  | 41.0575 | -92.1364 |
+----+---------+----------+
| 2  | 47.0254 | -92.5723 |
+----+---------+----------+
| 3  | 38.9897 | -88.7623 |
+----+---------+----------+
Run Code Online (Sandbox Code Playgroud)

我正在寻找更大的桌子,地点

+----+---------+-----------+
| ID |   Lat   |    Lon    |
+----+---------+-----------+
| 1  | 41.0575 | -92.1364  |
+----+---------+-----------+
| 2  | 47.0254 | -92.5723  |
+----+---------+-----------+
| 2  | 38.9897 | -88.7623  |
+----+---------+-----------+
| 4  | 36.2137 | -91.6528  |
+----+---------+-----------+
| 5  | 39.2643 | -123.0073 |
+----+---------+-----------+
| 6  | 39.941  | -123.0073 |
+----+---------+-----------+
| 7  | 35.7683 | -91.6528  |
+----+---------+-----------+
| 8  | 45.8406 | -91.6528  |
+----+---------+-----------+
Run Code Online (Sandbox Code Playgroud)

让我们假设,使用Haversine公式,位置5和6位于位置1的20英里内,位置4和8位于位置2的20英里范围内.

我希望返回这样的东西:

+----+------------+----------+
| ID | LocationID | Distance |
+----+------------+----------+
| 1  | 5          | 15.4     |
+----+------------+----------+
| 1  | 6          | 16       |
+----+------------+----------+
| 2  | 4          | 17.4     |
+----+------------+----------+
| 2  | 8          | 2.5      |
+----+------------+----------+
Run Code Online (Sandbox Code Playgroud)

每个位置可能在20英里内有零到多个位置,我试图在另一个表中捕获它.

如有必要,我可以加上澄清.感谢您的时间.

Jua*_*eza 6

SELECT 
     LS.ID, 
     L.ID as LocationID, 
     MS_DISTANCE (LS.Lat , LS.Lon, L.Lat , L.Lon) as Distance
FROM LocationSubset LS
JOIN Locations L 
  ON MS_DISTANCE (LS.Lat , LS.Lon, L.Lat , L.Lon) < 20
 AND LS.ID <> L.ID    -- if you want remove comparasion with same object
Run Code Online (Sandbox Code Playgroud)

但是你可以更好地使用sql server空间函数,因为那些允许使用空间索引.空间数据