Cela se produit en raison de l'ordre de traitement naturel des requêtes, qui est le suivant :
FROM
ON
OUTER
WHERE
GROUP BY
CUBE
|ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Vous attribuez votre alias dans SELECT
déclaration. Comme vous pouvez le voir WHERE
est traité avant SELECT
et ORDER BY
vient après. C'est la raison. Maintenant, quelles sont les solutions :
- Sous-requêtes. Mais ils peuvent être difficiles à lire.
CROSS APPLY
. Cela devrait embellir votre code un peu et est la méthode recommandée.
CROSS APPLY
attribuera un alias avant WHERE
instruction, ce qui la rend utilisable dedans.
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 vous voulez en savoir plus. Veuillez lire cette question : Quel est l'ordre d'exécution de cette instruction SQL