Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中,如何在一个表中返回距离坐标小于20英里的值?_Sql_Sql Server - Fatal编程技术网

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

在SQL Server中,如何在一个表中返回距离坐标小于20英里的值?,sql,sql-server,Sql,Sql Server,这是我一整天都在努力解决的一个非常有趣的问题。我有一个带有ID、纬度和经度的表。这是一组较大位置中的位置子集 我想做的是使用这个位置子集,对于每个位置,使用空中距离返回距离较大位置20英里以内的位置。我的问题不是计算空中距离,这是可行的,我的问题是如何像For循环一样对每一行进行操作,而是使用基于集合的方法 假设这是我的子集表LocationSubset +----+---------+----------+ | ID | Lat | Lon | +----+---------

这是我一整天都在努力解决的一个非常有趣的问题。我有一个带有ID、纬度和经度的表。这是一组较大位置中的位置子集

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

假设这是我的子集表LocationSubset

+----+---------+----------+
| ID |   Lat   |    Lon   |
+----+---------+----------+
| 1  | 41.0575 | -92.1364 |
+----+---------+----------+
| 2  | 47.0254 | -92.5723 |
+----+---------+----------+
| 3  | 38.9897 | -88.7623 |
+----+---------+----------+
我正在看更大的桌子,位置

+----+---------+-----------+
| 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  |
+----+---------+-----------+
让我们假设,使用哈弗森公式,位置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      |
+----+------------+----------+
每个位置可能在20英里内有零到多个位置,我正试图在另一个表中记录这一点

如有必要,我可以补充澄清。谢谢你抽出时间

SELECT subtable.ID as ID1, subtable.Lat as Lat1, subtable.Lon AS Lon1,
    Locations.ID as ID2, Locations.Lat as Lat2, Locations.Lon AS Lon2,
    (CalculatedDistance using Lat1,Lon1,Lat2,Lon2) AS Distance
FROM subtable CROSS JOIN maintable
WHERE (CalculatedDistance using Lat1,Lon1,Lat2,Lon2)<20
其中subtable生成子表的查询/视图

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

但使用SQLServer空间函数可能更好,因为这些函数允许使用空间索引

您可能希望排除匹配的记录,因此在联接中使用该记录,然后交叉应用距离函数

SELECT ls.Id,
       l.Id LocationID,
       d.Distance
FROM   LocationSubset ls 
       JOIN Location l ON ls.Id <> l.Id
       CROSS APPLY (SELECT dbo.MS_DISTANCE(ls.Lat, ls.Lon, l.Lat, l.Lon) Distance) d
WHERE  d.Distance < 20

您可以尝试交叉连接两个表,并使用其中一个答案中的函数来过滤结果。什么是ms_距离?抱歉,这是一个自定义项,但它是一个距离计算,包含两组纬度和经度,并返回距离。直到我走近一点才意识到这是一个UDF。你可能想看看这篇文章,这要求MS_距离是一个表值函数吗?不。。如果是这样的话,您必须使用类似于交叉应用从dbo选择距离的东西。MS_DISTANCEls.Lat、ls.Lon、l.Lat、l.LonI将使用ls.id l.id代替。因为你可以在同一个地方有不同的位置。在购物中心或购物中心中创建多个点时,通常发生在我的数据中Building@JuanCarlosOropeza是的,你说得对。。我只是注意到。。非常干净谢谢你,我错过了那一步。希望我不会因为抄袭别人而作弊。回答:PMy的数据集比我发布的要复杂一点,所以我花了一点力气让它工作起来,但它现在似乎正在运行。谢谢你的帮助!