Предложение Наличие/где не работает для формулы Хаверсина с использованием Microsoft SQL

Вот моя таблица с именем «тест». Проверьте снимок здесь test

А затем мои элементы строки: здесь - элементы строки

Я использую формулу гаверсинуса, он мой запрос

  SELECT *, ( 3960 * acos( cos( radians( 33.650800 ) ) *
  cos( radians( Latitude ) ) * cos( radians(  Longitude  ) - radians( -117.891729 ) ) +
  sin( radians( 33.650800 ) ) * sin( radians(  Latitude  ) ) ) ) AS Distance 
  FROM test

По какой-то причине предложение HAVING или WHERE не работает с Distance.

Он работает с Latitude или Longitude.

Но когда я пытаюсь сделать WHERE Distance < 10 or HAVING Distance < 10. Там написано Distance is an invalid column name.

Мне нужно иметь возможность сделать это и сделать запрос, используя Distance. Любая помощь будет оценена по достоинству.


person vbaid    schedule 03.07.2015    source источник
comment
Я рекомендую вам прочитать это: blogs.lessthandot.com/index.php/datamgmt/datadesign/ В этом блоге я покажу несколько умных способов ускорить выполнение поиска по близости. Это особенно верно, если в вашей таблице много строк.   -  person George Mastros    schedule 03.07.2015
comment
голосуй за! хороший вопрос!   -  person SQL Police    schedule 03.07.2015


Ответы (2)


Вы не можете использовать вычисляемые поля в предложении where или have. Создайте представление или используйте подзапрос

Попробуй это:

select * FROM (SELECT *, ( 3960 * acos( cos( radians( 33.650800 ) ) *
cos( radians( Latitude ) ) * cos( radians(  Longitude  ) - radians( -117.891729 ) ) +
sin( radians( 33.650800 ) ) * sin( radians(  Latitude  ) ) ) ) AS Distance 
FROM test) as T WHERE T.Distance < 10
person ericpap    schedule 03.07.2015

Вам нужно поместить свой запрос в подзапрос, представление или CTE (общее табличное выражение).

Вот пример для вашей задачи с CTE:

WITH cte_test (Name, Latitude, Longitude, Distance)
AS 
(
    SELECT Name, Latitude, Longitude, 
         3960 * acos(cos(radians(33.650800)) 
         * cos(radians( Latitude ) )  
         * cos( radians(  Longitude  ) - radians( -117.891729 ) ) 
         + sin( radians( 33.650800 ) ) * sin( radians(  Latitude  ) ) ) ) 
         AS Distance 
    FROM test
)
SELECT * from cte_test where Distance < 10 ;

CTE — это своего рода «временное представление». Это также мощный инструмент, который также можно использовать для создания рекурсивных запросов.

person SQL Police    schedule 03.07.2015