Isso acontece devido à ordem natural de processamento da consulta, que é a seguinte:
FROM
ON
OUTER
WHERE
GROUP BY
CUBE
|ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Você está atribuindo seu alias em
SELECT
declaração. Como você pode ver WHERE
é processado antes de SELECT
e ORDER BY
vem depois disso. Essa é a razão. Agora, quais são as soluções alternativas:- Subconsultas. Mas eles podem ser difíceis de ler.
CROSS APPLY
. Isso deve embelezar seu código um pouco e é o método recomendado.
CROSS APPLY
atribuirá um alias antes de WHERE
declaração, tornando-a utilizável nela. SELECT [Hotel Id]
, latitude
, longitude
, establishmentname
, Distance
FROM [dbo].[RPT_hotels]
CROSS APPLY (
SELECT 6371 * ACos(Cos(RADIANS(Latitude)) * Cos(RADIANS('50.017466977673905')) * Cos(RADIANS('24.69924272460935') - RADIANS(Longitude)) + Sin(RADIANS(Latitude)) * Sin(RADIANS('50.017466977673905')))
) AS T(Distance)
WHERE distance < 30
ORDER BY Distance;
Se você quiser saber mais. Leia esta pergunta: Qual é a ordem de execução para esta instrução SQL