सारांश
इसका कोई तार्किक कारण नहीं है, लेकिन यह लाभ छोटा है और कुछ ऐसे नुकसान हैं जो तुरंत स्पष्ट नहीं हो सकते हैं।
शोध का परिणाम
मैंने कुछ शोध किया और कुछ अच्छी जानकारी पाई। 2012-08-09 17:49 GMT पर एक विश्वसनीय प्राथमिक स्रोत (जो गुमनाम रहना चाहता है) से एक प्रत्यक्ष उद्धरण निम्नलिखित है:
जब एसक्यूएल का आविष्कार किया गया था, तो इसका चयन खंड में कोई उपनाम नहीं था। यह एक गंभीर कमी थी जिसे 1986 में ANSI द्वारा भाषा को मानकीकृत किए जाने पर ठीक किया गया था।
भाषा को "गैर-प्रक्रियात्मक" होने का इरादा था - दूसरे शब्दों में, उस डेटा का वर्णन करने के लिए जिसे आप इसे खोजने के लिए निर्दिष्ट किए बिना चाहते हैं। इसलिए, जहाँ तक मुझे पता है, इसका कोई कारण नहीं है कि एक SQL कार्यान्वयन इसे संसाधित करने से पहले पूरी क्वेरी को पार्स नहीं कर सकता है, और एलियास को कहीं भी परिभाषित करने और हर जगह उपयोग करने की अनुमति देता है। उदाहरण के लिए, मुझे निम्नलिखित क्वेरी मान्य नहीं होने का कोई कारण दिखाई नहीं देता:
select name, salary + bonus as pay
from employee
where pay > 100000
हालांकि मुझे लगता है कि यह एक उचित प्रश्न है, कुछ SQL- आधारित सिस्टम कुछ कार्यान्वयन से संबंधित कारणों के लिए उपनाम के उपयोग पर प्रतिबंध लगा सकते हैं। मुझे यह सुनकर आश्चर्य नहीं हुआ कि SQL सर्वर ऐसा करता है।
मैं SQL-86 मानक में और अधिक शोध में दिलचस्पी रखता हूं और आधुनिक DBMSes उर्फ पुन: उपयोग का समर्थन क्यों नहीं करते हैं, लेकिन अभी तक इसके साथ बहुत दूर होने का समय नहीं है। शुरुआत के लिए, मुझे नहीं पता कि दस्तावेज कहां से मिलें या कैसे पता लगाया जाए कि समिति किसने बनाई है। क्या कोई मदद कर सकता है? मैं मूल Sybase उत्पाद के बारे में अधिक जानना चाहूंगा जो SQL सर्वर से आया था।
इस शोध और कुछ और विचारों से, मुझे यह संदेह हुआ है कि अन्य धाराओं में उपनामों का उपयोग करना, जबकि बहुत संभव है, बस कभी नहीं रहा है कि अन्य भाषा सुविधाओं की तुलना में DBMS निर्माताओं के लिए एक उच्च प्राथमिकता है। चूंकि ऐसा नहीं है कि एक बाधा के बहुत से, आसानी से क्वेरी लेखक द्वारा चारों ओर काम किया जा रहा है, अन्य प्रगति पर इसमें प्रयास करना इष्टतम नहीं है। इसके अतिरिक्त, यह मालिकाना होगा क्योंकि यह स्पष्ट रूप से एसक्यूएल मानक का हिस्सा नहीं है (हालांकि मैं निश्चित रूप से उस पर और अधिक जानकारी प्राप्त करने के लिए इंतजार कर रहा हूं) और इस तरह एक मामूली सुधार होगा, डीबीएमएस के बीच एसक्यूएल संगतता को तोड़ना। तुलना करके, CROSS APPLY
(जो बाहरी संदर्भों की अनुमति देने वाली एक व्युत्पन्न तालिका से अधिक कुछ नहीं है) एक बहुत बड़ा बदलाव है, जबकि मालिकाना अविश्वसनीय अभिव्यंजक शक्ति प्रदान करता है जो आसानी से अन्य तरीकों से नहीं किया जाता है।
हर जगह उपनाम का उपयोग करने के साथ समस्या
यदि आप सेलेक्ट आइटम को WHERE क्लॉज में रखने की अनुमति देते हैं, तो आप न केवल क्वेरी की जटिलता (और इस तरह एक अच्छा निष्पादन योजना खोजने की जटिलता) को पूरी तरह से अतार्किक सामग्री के साथ आना संभव है। प्रयत्न:
SELECT X + 5 Y FROM MyTable WHERE Y = X
क्या होगा यदि MyTable में पहले से ही एक कॉलम Y है, जिसमें से किसका जिक्र है? समाधान एक सीटीई या एक व्युत्पन्न तालिका का उपयोग करना है, जिसे ज्यादातर मामलों में कोई अतिरिक्त खर्च नहीं करना चाहिए, लेकिन समान अंतिम परिणाम प्राप्त होता है। सीटीई और व्युत्पन्न टेबल कम से कम एक बार केवल एक उपनाम का उपयोग करने की अनुमति देकर अस्पष्टता के संकल्प को लागू करते हैं।
इसके अलावा, FROM क्लॉज में एलियासेस का उपयोग नहीं करना प्रख्यात अर्थ है। आप ऐसा नहीं कर सकते:
SELECT
T3.ID + (SELECT Min(Interval) FROM Intervals WHERE IntName = 'T') CalcID
FROM
Table1 T
INNER JOIN Table2 T2
ON T2.ID = CalcID
INNER JOIN Table3 T3
ON T2.ID = T3.ID
यही कारण है कि एक परिपत्र संदर्भ (इस अर्थ में कि टी 2 गुप्त रूप से टी 3 से एक मूल्य के लिए बात कर रहा है, इससे पहले कि उस तालिका में शामिल हों सूची में प्रस्तुत किया गया है), और है रफ़ू मुश्किल देखने के लिए। इसके बारे में क्या खयाल है:
INSERT dbo.FinalTransaction
SELECT
newid() FinalTransactionGUID,
'GUID is: ' + Convert(varchar(50), FinalTransactionGUID) TextGUID,
T.*
FROM
dbo.MyTable T
आप कितना शर्त लगाना चाहते हैं कि न्यूड () फ़ंक्शन को निष्पादन योजना में दो बार डाला जा रहा है, पूरी तरह से अप्रत्याशित रूप से दो कॉलम को अलग-अलग मान दिखा रहा है? क्या होगा जब उपरोक्त क्वेरी का उपयोग CTE या व्युत्पन्न तालिकाओं में N स्तर गहरे में किया जाता है। मैं गारंटी देता हूं कि समस्या आपकी कल्पना से भी बदतर है। जब कोई चीज़ केवल एक बार या किसी क्वेरी योजना में किस बिंदु पर आंकी जाती है, इस बारे में पहले से ही गंभीर असंगतता की समस्याएँ हैं, और Microsoft ने कहा है कि यह ठीक नहीं होगाउनमें से कुछ क्योंकि वे क्वेरी बीजगणित को ठीक से व्यक्त कर रहे हैं - यदि कोई अप्रत्याशित परिणाम प्राप्त करता है, तो क्वेरी को भागों में तोड़ दें। जंजीर संदर्भों की अनुमति देना, संभावित रूप से बहुत लंबी श्रृंखलाओं के माध्यम से परिपत्र संदर्भों का पता लगाना - ये काफी मुश्किल समस्याएं हैं। समानता का परिचय दें और आपको बनाने में एक बुरा सपना आया है।
नोट: WHERE या GROUP BY में उपनाम का उपयोग करने से नए () या रैंड () जैसे फ़ंक्शंस के साथ समस्याओं का कोई फर्क नहीं पड़ने वाला है।
पुन: प्रयोज्य अभिव्यक्ति बनाने के लिए एक SQL सर्वर तरीका
CROSS APPLY / OUTER APPLY SQL सर्वर में एक ऐसा तरीका है जो अभिव्यक्ति बनाने के लिए है जिसे क्वेरी में कहीं और इस्तेमाल किया जा सकता है (अभी पहले FROM क्लॉज में नहीं):
SELECT
X.CalcID
FROM
Table1 T
INNER JOIN Table3 T3
ON T.ID = T3.ID
CROSS APPLY (
SELECT
T3.ID + (SELECT Min(Interval) FROM Intervals WHERE IntName = 'T') CalcID
) X
INNER JOIN Table2 T2
ON T2.ID = X.CalcID
यह दो काम करता है:
- CROSS APPLY में सभी अभिव्यक्तियों को एक "नेमस्पेस" (एक टेबल उपनाम, यहाँ, एक्स) मिलता है और उस नेमस्पेस के भीतर अद्वितीय होना चाहिए।
- यह हर जगह स्पष्ट करता है कि न केवल कैल्सीड एक्स से आ रहा है, बल्कि यह भी स्पष्ट करता है कि टेबल टी 1 और टी 3 में शामिल होने पर आप एक्स से कुछ भी उपयोग क्यों नहीं कर सकते, क्योंकि एक्स अभी तक पेश नहीं किया गया है।
मैं वास्तव में CROSS APPLY का काफी शौकीन हूं। यह मेरा वफादार दोस्त बन गया है, और मैं हर समय इसका इस्तेमाल करता हूं। एक आंशिक UNPIVOT (जिसमें देशी वाक्यविन्यास का उपयोग करके PIVOT / UNPIVOT या UNIVIVOT / PIVOT की आवश्यकता होगी) की आवश्यकता है? CROSS APPLY के साथ संपन्न हुआ। एक गणना मूल्य की आवश्यकता है जिसे कई बार पुन: उपयोग किया जाएगा? किया हुआ। लिंक किए गए सर्वर पर कॉल के लिए निष्पादन आदेश को सख्ती से लागू करने की आवश्यकता है? गति में एक चिल्ला सुधार के साथ किया। केवल एक प्रकार की पंक्ति को 2 पंक्तियों या अतिरिक्त स्थितियों के साथ विभाजित करने की आवश्यकता है? किया हुआ।
तो बहुत कम से कम, DBMS SQL Server 2005 और ऊपर में, आपके पास शिकायत का कोई और कारण नहीं है: CROSS APPLY यह है कि आप जिस तरह से चाहते हैं, उसी तरह से आप कैसे सूखी हैं।