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

Референтен псевдоним (изчислен в SELECT) в клаузата WHERE

Не можете да препращате към псевдоним, освен в ORDER BY, защото SELECT е втората последна клауза, която се оценява. Две решения:

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

Или просто повторете израза:

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

Предпочитам последното. Ако изразът е изключително сложен (или скъп за изчисляване), вероятно трябва да помислите за изчислена колона (и може би да се запази), особено ако много заявки се отнасят до същия този израз.

PS страховете ви изглеждат неоснователни. Поне в този прост пример SQL Server е достатъчно умен, за да извърши изчислението само веднъж, въпреки че сте го посочили два пъти. Продължете напред и сравнете плановете; ще видиш, че са идентични. Ако имате по-сложен случай, в който виждате израза да се оценява няколко пъти, моля, публикувайте по-сложната заявка и плановете.

Ето 5 примерни заявки, които дават абсолютно същия план за изпълнение:

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;

Резултатен план за всичките пет заявки:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в SQL сървъра:низови или двоични данни ще бъдат съкратени

  2. Изберете стойности от полето XML в SQL Server 2008

  3. Най-добрите начини за използване на SQL DELETE оператор в SQL таблица

  4. Създайте обвързан изглед към схема в SQL Server

  5. Има ли разлика между SQL Server Express (2012) и LocalDB?