Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“SQL Server查询”;方程式;_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

使用“SQL Server查询”;方程式;

使用“SQL Server查询”;方程式;,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正试图通过以下方式了解如何构建SQL查询: 我的SQL Server数据库中存储了坐标,我正在尝试选择距点指定距离内的所有记录 有什么办法吗 SELECT * FROM YourTable INNER JOIN (SELECT (sqrt( ( xDestination - xOrigin)^2 + ( yDestination - yOrigin)^2 )) AS Distance FROM YourTable) AS computed ON YourTable.id = compu

我正试图通过以下方式了解如何构建SQL查询:

我的SQL Server数据库中存储了坐标,我正在尝试选择距点指定距离内的所有记录

有什么办法吗

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
我不知道您的确切定义以及您希望如何处理坐标的输入,因为我不知道您是否使用服务器端语言来输入数据,所以这只是一个一般示例


我不知道您的确切定义以及您希望如何处理坐标的输入,因为我不知道您是否使用服务器端语言输入数据,所以这只是一个一般示例,这比乍一看更有趣,因为您说“在指定的距离”

第一个简单的解决方案是毕达哥拉斯距离计算,即

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 = (@myDistance-@myError)^2
SET @mySqrDistanceMax = (@myDistance+@myError)^2

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

这比乍一看更有趣,因为你说“在指定的距离”

第一个简单的解决方案是毕达哥拉斯距离计算,即

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 = (@myDistance-@myError)^2
SET @mySqrDistanceMax = (@myDistance+@myError)^2

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

首先,什么样的坐标是线性坐标还是三维坐标,因为在这两种情况下距离的计算是不同的。此外,一些代码和数据库信息也会非常有用。如果您的坐标是使用地理数据类型存储的,则可以使用STDistance方法获取到您点的距离-请参见。首先,由于两种情况下的距离计算不同,所以哪种坐标是线性坐标还是三维坐标。另外,一些代码和数据库信息也会非常有用。如果您的坐标是使用地理数据类型存储的,那么您可以使用STDistance方法获取到您点的距离-请参见。太棒了,这正是我需要的!非常感谢你的帮助!太棒了,这正是我需要的!非常感谢你的帮助!