Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

संदर्भ उपनाम (चयन में परिकलित) WHERE खंड में

आप 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;

सभी पांच प्रश्नों के लिए परिणामी योजना:



  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 सर्वर में फ्लोट और न्यूमेरिक/दशमलव में क्या अंतर है - SQL सर्वर / T-SQL ट्यूटोरियल भाग 33

  2. SQL सर्वर 2008 में सबसे खराब प्रदर्शन करने वाले प्रश्नों को कैसे खोजें?

  3. SQL सर्वर डिफ़ॉल्ट वर्ण एन्कोडिंग

  4. SQL सर्वर में सभी अक्षम बाधाओं को वापस करें (T-SQL उदाहरण)

  5. SQL सर्वर राउंड () फ़ंक्शन:इसके लिए क्या है और आपको इसकी परवाह क्यों करनी चाहिए?