Cela se produit en raison de l'ordre de traitement naturel des requêtes, qui est le suivant :
FROMONOUTERWHEREGROUP BYCUBE|ROLLUPHAVINGSELECTDISTINCTORDER BYTOP
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