Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Impossible d'utiliser le nom d'alias dans la clause WHERE mais peut le faire dans ORDER BY

Cela se produit en raison de l'ordre de traitement naturel des requêtes, qui est le suivant :

  1. FROM
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. 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