Esto sucede debido al orden natural de procesamiento de consultas, que es el siguiente:
FROM
ON
OUTER
WHERE
GROUP BY
CUBE
|ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Estás asignando tu alias en SELECT
declaración. Como puedes ver WHERE
se procesa antes de SELECT
y ORDER BY
viene después de eso. Esa es la razón. Ahora, ¿cuáles son las soluciones alternativas:
- Subconsultas. Pero pueden ser difíciles de leer.
CROSS APPLY
. Esto debería embellecer su código un poco y es el método recomendado.
CROSS APPLY
asignará un alias antes de WHERE
declaración, haciéndola utilizable en ella.
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;
Si quieres saber más. Lea esta pregunta: ¿Cuál es el orden de ejecución de esta instrucción SQL?