Ciò accade a causa dell'ordine di elaborazione della query naturale, che è il seguente:
FROM
ON
OUTER
WHERE
GROUP BY
CUBE
|ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Stai assegnando il tuo alias in SELECT
dichiarazione. Come puoi vedere WHERE
viene elaborato prima di SELECT
e ORDER BY
viene dopo. Questa è la ragione. Ora quali sono le soluzioni alternative:
- Subquery. Ma possono essere difficili da leggere.
CROSS APPLY
. Questo dovrebbe abbellire un po 'il tuo codice ed è un metodo consigliato.
CROSS APPLY
assegnerà l'alias prima di WHERE
dichiarazione, rendendola utilizzabile in essa.
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 vuoi saperne di più. Si prega di leggere questa domanda: Qual è l'ordine di esecuzione di questa istruzione SQL