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

Bí danh tham chiếu (được tính bằng SELECT) trong mệnh đề WHERE

Bạn không thể tham chiếu bí danh ngoại trừ trong ORDER BY vì SELECT là mệnh đề cuối cùng thứ hai được đánh giá. Hai cách giải quyết:

SELECT BalanceDue FROM (
  SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
  FROM Invoices
) AS x
WHERE BalanceDue > 0;

Hoặc chỉ lặp lại biểu thức:

SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE  (InvoiceTotal - PaymentTotal - CreditTotal)  > 0;

Tôi thích cái sau hơn. Nếu biểu thức cực kỳ phức tạp (hoặc tốn kém để tính toán), bạn có thể nên xem xét một cột được tính toán (và có thể vẫn tồn tại) thay vào đó, đặc biệt nếu nhiều truy vấn tham chiếu đến cùng một biểu thức này.

Tái bút rằng nỗi sợ hãi của bạn dường như không có cơ sở. Trong ví dụ đơn giản này, SQL Server đủ thông minh để chỉ thực hiện phép tính một lần, mặc dù bạn đã tham chiếu nó hai lần. Đi trước và so sánh các kế hoạch; bạn sẽ thấy chúng giống hệt nhau. Nếu bạn gặp trường hợp phức tạp hơn trong đó bạn thấy biểu thức được đánh giá nhiều lần, vui lòng đăng truy vấn phức tạp hơn và các kế hoạch.

Dưới đây là 5 truy vấn mẫu mà tất cả đều mang lại cùng một kế hoạch thực thi:

SELECT LEN(name) + column_id AS x
FROM sys.all_columns
WHERE LEN(name) + column_id > 30;

SELECT x FROM (
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE x > 30;

SELECT LEN(name) + column_id AS x
FROM sys.all_columns
WHERE column_id + LEN(name) > 30;

SELECT name, column_id, x FROM (
SELECT name, column_id, LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE x > 30;

SELECT name, column_id, x FROM (
SELECT name, column_id, LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE LEN(name) + column_id > 30;

Kế hoạch kết quả cho tất cả năm truy vấn:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi một ngày thành một múi giờ khác trong SQL Server

  2. Cách lấy danh sách các Bảng không có Ràng buộc khóa chính trong tất cả Cơ sở dữ liệu của Phiên bản SQL Server - Hướng dẫn SQL Server / TSQL Phần 62

  3. Làm cách nào để đặt chuỗi kết nối SQL Server?

  4. Giải thích về ANSI_NULLS của Máy chủ SQL

  5. Đổi tên Kiểu dữ liệu do người dùng xác định trong SQL Server (T-SQL)