2011-06-08 59 views
0

我想弄清楚如何建立一個SQL查詢以下列方式:SQL Server查詢與「公式」

我有座標存儲在我的SQL Server數據庫,我試圖選擇所有的記錄距離點的指定距離。

任何想法如何完成它?

+1

首先什麼樣的座標線性或3d,因爲在這兩種情況下距離的計算都是不同的。還有一些代碼和數據庫信息會非常有幫助。 – 2011-06-08 15:17:51

+1

如果您的座標使用地理數據類型進行存儲,則可以使用STDistance方法獲得距離您的距離 - 請參閱http://msdn.microsoft.com/zh-cn/library/bb933952.aspx。 – 2011-06-08 15:28:44

+0

coords是線性的 – 2011-06-08 15:33:24

回答

2
SELECT * 
FROM YourTable 
INNER JOIN 
(SELECT (sqrt((xDestination - xOrigin)^2 + (yDestination - yOrigin)^2)) AS Distance 
    FROM YourTable) AS computed ON YourTable.id = computed.id 
WHERE computed.Distance = SpecifiedDistance 

我不知道你的確切定義,你會希望如何處理座標的輸入,因爲我不知道你是否正在使用服務器端語言輸入數據,因此這只是一個普通的例子

+0

真棒,這正是我需要的!非常感謝你的幫助! – 2011-06-08 16:34:54

1

這比一看起來更有趣,因爲你說'在指定的距離'。

第一刀簡單的解決方案是畢達哥拉斯的距離計算,即

SELECT * FROM myTable 
WHERE SQRT((myPositionX - @pointX)^2 + (myPositionY - @pointY)^2) = @myDistance 

但是這樣做對變量浮點比較是從來沒有因爲不準確的一個好主意,這是在這種情況下加劇,因爲平方根 - 你實際上並不需要。很顯然,如果從A到B的距離是X,那麼從A到B的距離的平方也是X平方。因此,下切是

SET @mySqrDistance = @myDistance^2 

SELECT * FROM myTable 
WHERE ((myPositionX - @pointX)^2 + (myPositionY - @pointY)^2) = @mySqrDistance 

不僅是這更多的是因爲去除SQRT的準確,這也是出於同樣的原因很多更快(平方根函數,雖然進行了優化,速度很慢)。但是你仍然有花車比較在一定程度上的問題(當然這取決於SQL和列類型使用的味道,但在一般情況),因此更好的辦法可能是

SET @mySqrDistanceMin = (@[email protected])^2 
SET @mySqrDistanceMax = (@[email protected])^2 

SELECT * FROM myTable 
WHERE ((myPositionX - @pointX)^2 + (myPositionY - @pointY)^2) 
BETWEEN @mySqrDistanceMin AND mySqrDistanceMax