Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Non è possibile utilizzare il nome alias nella clausola WHERE ma è possibile farlo in ORDER BY

Ciò accade a causa dell'ordine di elaborazione della query naturale, che è il seguente:

  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

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