我有一个包含多行的表。该表具有非空地理类型列。
假设我有一个包含以下列的表: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给出的答案也达到了相同的结果,这正是我想要的,所以谢谢!
出于好奇,如何提高此查询的性能?