Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Не може да се използва псевдоним в клаузата WHERE, но може в ORDER BY

Това се случва поради естествения ред на обработка на заявките, който е следният:

  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

Присвоявате своя псевдоним в SELECT изявление. Както можете да видите WHERE се обработва преди SELECT и ORDER BY идва след него. Това е причината. Сега какви са заобиколните решения:

  • Подзаявки. Но могат да бъдат трудни за четене.
  • CROSS APPLY . Това трябва да разкраси вашия код малко и е препоръчителен метод.

CROSS APPLY ще присвои псевдоним преди WHERE израз, което го прави използваем в него.

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;

Ако искате да разберете повече. Моля, прочетете този въпрос: Какъв е редът на изпълнение за този 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. Добавете препратка към dll на трета страна в компонента на ssis скрипт

  2. SQL Server и имплицитно преобразуване на типове

  3. Индексът е извън границите на масива. (Microsoft.SqlServer.smo)

  4. Преобразуване на дата в друга часова зона в SQL Server

  5. Каскадно изтриване или използване на тригери?