2017-08-12 61 views
2

我有一個包含多行的表。該表具有非空的地理類型列。在帶有地理列的表上查詢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 

但它沒有做我想做的事。

任何幫助將不勝感激!

回答

0

這聽起來像你可能需要一個交叉連接。這在兩個表格之間創建了笛卡爾積。你可以閱讀關於它here。如果桌子非常大,表現不是很好。這是你的問題嗎?

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

讓我知道如果你想要什麼,這並不這樣做,我們可以努力改善它。

0

我設法得到了我正在尋找的結果。

下面是代碼:

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給出的答案也獲得相同的結果,這正是我想要的,所以謝謝!

出於好奇,如何才能提高此查詢的性能?

相關問題