sql >> Base de Datos >  >> RDS >> Sqlserver

No se puede usar el nombre de alias en la cláusula WHERE pero sí en ORDER BY

Esto sucede debido al orden natural de procesamiento de consultas, que es el siguiente:

  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

Estás asignando tu alias en SELECT declaración. Como puedes ver WHERE se procesa antes de SELECT y ORDER BY viene después de eso. Esa es la razón. Ahora, ¿cuáles son las soluciones alternativas:

  • Subconsultas. Pero pueden ser difíciles de leer.
  • CROSS APPLY . Esto debería embellecer su código un poco y es el método recomendado.

CROSS APPLY asignará un alias antes de WHERE declaración, haciéndola utilizable en ella.

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 quieres saber más. Lea esta pregunta: ¿Cuál es el orden de ejecución de esta instrucción SQL?