2011-06-08 62 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