sql >> Database >  >> RDS >> Sqlserver

Kan Alias-naam niet gebruiken in WHERE-clausule, maar wel in ORDER BY

Dit gebeurt vanwege de natuurlijke volgorde voor het verwerken van zoekopdrachten, namelijk de volgende:

  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

Je wijst je alias toe in SELECT uitspraak. Zoals je kunt zien WHERE wordt verwerkt vóór SELECT en ORDER BY komt erachter. Dat is de reden. Wat zijn nu de oplossingen:

  • Subquery's. Maar ze kunnen moeilijk te lezen zijn.
  • CROSS APPLY . Dit moet verfraaien uw code een beetje en is de aanbevolen methode.

CROSS APPLY zal een alias toewijzen vóór WHERE statement, waardoor het erin bruikbaar is.

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;

Als je meer wilt weten. Lees deze vraag: Wat is de volgorde van uitvoering van deze SQL-instructie



  1. Gelijktijdige UPDATE's op MySQL TRIGGER

  2. Welsprekende groep Door SQLSTATE [42000] te maken met geldige SQL-query in Laravel 5.3

  3. Multi-dimensionale array van overeenkomende mysql-kolommen

  4. De CHECK-component voor bij te werken weergaven