Dzieje się tak z powodu naturalnej kolejności przetwarzania zapytań, która jest następująca:
FROM
ON
OUTER
WHERE
GROUP BY
CUBE
|ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
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