Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Nie można użyć nazwy aliasu w klauzuli WHERE, ale można w ORDER BY

Dzieje się tak z powodu naturalnej kolejności przetwarzania zapytań, która jest następująca:

  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

Przypisujesz swój alias w SELECT oświadczenie. Jak widać WHERE jest przetwarzany przed SELECT i ORDER BY przychodzi po nim. To jest powód. Teraz jakie są rozwiązania:

  • Podzapytania. Ale mogą być trudne do odczytania.
  • CROSS APPLY . To powinno upiększać Twój kod i jest to zalecana metoda.

CROSS APPLY przypisze alias przed WHERE oświadczenie, czyniąc go użytecznym w nim.

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;

Jeśli chcesz dowiedzieć się więcej. Przeczytaj to pytanie: Jaka jest kolejność wykonywania tej instrukcji SQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Automatyczne usuwanie zablokowanych procesów w MS SQL Server

  2. Czy przy zwiększeniu rozmiaru kolumny VARCHAR na dużym stole mogą wystąpić jakieś problemy?

  3. 3 sposoby uzyskania etapów zadania zadania agenta serwera SQL (T-SQL)

  4. Czy mogę zapisać „Obiekt” w bazie danych SQL Server?

  5. Programowo kopiuj indeksy z jednej tabeli do drugiej w SQL Server