sql >> Databasteknik >  >> RDS >> Sqlserver

Kan inte använda Alias-namn i WHERE-sats men kan i ORDER BY

Detta händer på grund av naturlig frågebehandlingsordning, som är följande:

  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

Du tilldelar ditt alias i SELECT påstående. Som du kan se WHERE bearbetas före SELECT och ORDER BY kommer efter det. Det är anledningen. Vad är nu lösningarna:

  • Undersökningar. Men de kan vara svåra att läsa.
  • CROSS APPLY . Detta bör försköna din kod lite och rekommenderas metod.

CROSS APPLY kommer att tilldela alias före WHERE uttalande, vilket gör det användbart i det.

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;

Om du vill veta mer. Läs den här frågan: Vilken är exekveringsordningen för denna SQL-sats



  1. Varför stöds inte val från lagrad procedur i relationsdatabaser?

  2. Effektiv metod för att visa grupptitel en gång — PHP/MySQL/jQuery

  3. Hur man exporterar endast utskrivbar text (eller någon annan paketegenskap) i wireshark

  4. Hur kan jag gå med i en härledd tabell?