Запрос SQL Server с «уравнением» - PullRequest
0 голосов
/ 08 июня 2011

Я пытаюсь выяснить, как построить запрос SQL следующим образом:

У меня есть координаты, хранящиеся в моей базе данных SQL Server, и я пытаюсь выбрать все записи на указанном расстоянии от точки.

Есть идеи, как это сделать?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011
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

Я не знаю ваших точных определений и того, как бы вы хотели обрабатывать ввод координат, так как я не знаю, используете ли вы язык на стороне сервера для ввода данных, так что это всего лишь общий пример

1 голос
/ 08 июня 2011

Это интереснее, чем кажется на первый взгляд, потому что вы говорите «на указанном расстоянии».

Первое простое решение - вычисление расстояния Пифагора, то есть

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...