Điều này xảy ra do thứ tự xử lý truy vấn tự nhiên, như sau:
-
FROM
-
ON
-
OUTER
-
WHERE
-
GROUP BY
-
CUBE
|ROLLUP
-
HAVING
-
SELECT
-
DISTINCT
-
ORDER BY
-
TOP
Bạn đang chỉ định bí danh của mình trong SELECT
bản tường trình. Như bạn có thể thấy WHERE
được xử lý trước SELECT
và ORDER BY
đến sau nó. Đó là lý do. Bây giờ các giải pháp thay thế là gì:
- Truy vấn con. Nhưng chúng có thể khó đọc.
-
CROSS APPLY
. Điều này sẽ làm đẹp mã của bạn một chút và đó là phương pháp được đề xuất.
CROSS APPLY
sẽ gán bí danh trước WHERE
, làm cho nó có thể sử dụng được trong đó.
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;
Nếu bạn muốn tìm hiểu thêm. Vui lòng đọc câu hỏi này: Thứ tự thực thi cho câu lệnh SQL này là gì