ORDER BY haricinde bir diğer ada başvuramazsınız çünkü SELECT, değerlendirilen ikinci son cümledir. İki geçici çözüm:
SELECT BalanceDue FROM (
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
) AS x
WHERE BalanceDue > 0;
Ya da sadece ifadeyi tekrarlayın:
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;
İkincisini tercih ederim. İfade son derece karmaşıksa (veya hesaplaması maliyetliyse), bunun yerine muhtemelen hesaplanan (ve belki de kalıcı olan) bir sütunu düşünmelisiniz, özellikle de birçok sorgu aynı ifadeye başvuruyorsa.
PS korkularınız temelsiz görünüyor. En azından bu basit örnekte, SQL Server, iki kez referans vermiş olsanız bile hesaplamayı yalnızca bir kez gerçekleştirecek kadar akıllıdır. Devam edin ve planları karşılaştırın; aynı olduklarını göreceksiniz. İfadenin birden çok kez değerlendirildiğini gördüğünüz daha karmaşık bir durumunuz varsa, lütfen daha karmaşık sorguyu ve planları gönderin.
Tam olarak aynı yürütme planını veren 5 örnek sorgu aşağıda verilmiştir:
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;
Beş sorgunun tümü için sonuç planı: