आप 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;
मैं बाद वाला पसंद करता हूं। यदि अभिव्यक्ति अत्यंत जटिल है (या गणना करने के लिए महंगा) तो आपको शायद इसके बजाय एक गणना किए गए कॉलम (और शायद लगातार) पर विचार करना चाहिए, खासकर यदि बहुत सारे प्रश्न इसी अभिव्यक्ति का संदर्भ देते हैं।
पुनश्च आपका डर निराधार लग रहा है। कम से कम इस सरल उदाहरण में, 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;
सभी पांच प्रश्नों के लिए परिणामी योजना:
