Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Não é possível usar o nome de alias na cláusula WHERE, mas pode em ORDER BY


Isso acontece devido à ordem natural de processamento da consulta, que é a seguinte:
  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

Você está atribuindo seu alias em SELECT declaração. Como você pode ver WHERE é processado antes de SELECT e ORDER BY vem depois disso. Essa é a razão. Agora, quais são as soluções alternativas:
  • Subconsultas. Mas eles podem ser difíceis de ler.
  • CROSS APPLY . Isso deve embelezar seu código um pouco e é o método recomendado.

CROSS APPLY atribuirá um alias antes de WHERE declaração, tornando-a utilizável nela.
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 você quiser saber mais. Leia esta pergunta: Qual é a ordem de execução para esta instrução SQL