आप ORDER BY को छोड़कर किसी अन्य नाम का संदर्भ नहीं दे सकते क्योंकि चयन दूसरा अंतिम खंड है जिसका मूल्यांकन किया गया है। दो समाधान:
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 सर्वर केवल एक बार गणना करने के लिए पर्याप्त स्मार्ट है, भले ही आपने इसे दो बार संदर्भित किया हो। आगे बढ़ो और योजनाओं की तुलना करें; आप देखेंगे कि वे समान हैं। यदि आपके पास एक अधिक जटिल मामला है जहाँ आप देखते हैं कि अभिव्यक्ति का मूल्यांकन कई बार किया गया है, तो कृपया अधिक जटिल प्रश्न और योजनाएँ पोस्ट करें।
यहां 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;
सभी पांच प्रश्नों के लिए परिणामी योजना: