Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Der Aliasname kann nicht in der WHERE-Klausel verwendet werden, aber in ORDER BY

Dies geschieht aufgrund der natürlichen Abfrageverarbeitungsreihenfolge, die wie folgt lautet:

  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

Sie weisen Ihren Alias ​​in SELECT zu Aussage. Wie Sie WHERE sehen können wird vor SELECT verarbeitet und ORDER BY kommt danach. Das ist der Grund. Was sind nun die Problemumgehungen:

  • Unterabfragen. Aber sie können schwer zu lesen sein.
  • CROSS APPLY . Das soll verschönern Ihr Code ein bisschen und ist empfohlene Methode.

CROSS APPLY wird einen Alias ​​vor WHERE zuweisen -Anweisung, um sie darin verwendbar zu machen.

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;

Wenn Sie mehr erfahren möchten. Bitte lesen Sie diese Frage: In welcher Reihenfolge wird diese SQL-Anweisung ausgeführt