对具有"地理位置"列的表进行 SQL 查询,以查找是否有任何行与同一表中的任何其他行在一定距离内



我有一个包含多行的表。该表具有非空地理类型列。

假设我有一个包含以下列的表:ID、纬度、经度、地理数据。GeoData 列是 SQL Server 2016 中的地理类型。

我知道如何在距单个点一定距离内查找行。

我正在努力的是编写一个查询,该查询将所有行与其他除自身以外的每行进行比较 *.ID <> *.ID

我有类似的东西:

SELECT * FROM GeoTable tableA 
INNER JOIN GeoTable tableB ON tableA.ID = tableB.ID 
WHERE tableA.GeoData.STDistance(tableB.GeoData) <= 500 AND tableA.ID <> 
tableB.ID

但它没有做我想做的事。

任何帮助将不胜感激!

听起来您可能需要交叉连接。这将在两个表之间创建一个笛卡尔积。你可以在这里阅读它。如果表非常大,则性能不是很好。这对你来说是个问题吗?

SELECT * FROM GeoTable tableA 
OUTER APPLY GeoTable tableB
WHERE tableA.GeoData.STDistance(tableB.GeoData) <= 500 AND tableA.ID <> tableB.ID

如果这不符合您想要的效果,请告诉我,我们可以努力改进它。

我设法得到了我想要的结果。

这是代码:

SELECT
tableA.*,
tableB.*,
tableA.GeoData.STDistance(tableB.GeoData) AS DistanceApart
FROM GeoTable tableA
JOIN GeoTable tableB
ON (tableA.GeoData.STDistance(tableB.GeoData) <= 500) AND tableA.ID <> tableB.ID ORDER BY DistanceApart

但是,@BWarner给出的答案也达到了相同的结果,这正是我想要的,所以谢谢!

出于好奇,如何提高此查询的性能?

最新更新