Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Không thể sử dụng tên Bí danh trong mệnh đề WHERE nhưng có thể trong ORDER BY

Điều này xảy ra do thứ tự xử lý truy vấn tự nhiên, như sau:

  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

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 SELECTORDER 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ì



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để phân tích cú pháp một chuỗi và tạo một số cột từ nó?

  2. Chọn Thứ tự Sớm nhất cho một tập hợp các bài kiểm tra trong SQL dãy ngày

  3. Hủy chia với tên cột

  4. Thư mục Vòng lặp SSIS có thể thay đổi

  5. SQL Server:cách chọn địa chỉ liên hệ cấp độ thứ nhất, thứ hai và thứ ba