2015-11-24 9 views
5

नीचे मेरे पास दो टेबल #temp और # temp2 हैं।क्रॉस लागू और आंतरिक शामिल होने के बीच अंतर उदाहरण के आधार पर

create table #temp 
    (
    col1 int 
    ) 

    insert into #temp values(6),(1),(2),(3),(null) 



    create table #temp2 
    (
     col1 int 
     ) 
     insert into #temp2 values(1),(2),(1),(2),(3),(null) 

और मैं भी नीचे दो प्रश्नों अंदरूनी के साथ शामिल हों है:

SELECT t1.col1, 
      Sum(t2.col1) AS col1 
    FROM #temp t1 
      INNER JOIN #temp2 t2 
        ON t1.col1 = t2.col1 
    GROUP BY t1.col1 

परिणाम:

:

col1 col1 
1  2 
2  4 
3  3 

और दूसरा क्वेरी

क्रॉस के साथ लागू है

SELECT * 
FROM #temp t1 
     CROSS apply (SELECT Sum(col1) AS col1 
        FROM #temp2 t2 
        WHERE t1.col1 = t2.col1) A 

परिणाम:

col1 col1 
1  2 
2  4 
3  3 
6  NULL 

अब, मुझे पता है कि क्रॉस के बीच का अंतर लागू और आंतरिक शामिल हों चाहते हैं। मुझे पता है कि प्रत्येक व्यक्ति के लिए क्रॉन्स लागू होता है प्रत्येक के लिए और #temp (पहली तालिका) क्रॉस लागू करने के प्रत्येक रिकॉर्ड निष्पादित होगा। लेकिन मुझे उपरोक्त परिणाम सेट के आधार पर अलग-अलग परिणाम सेट मिल रहे हैं क्या कोई भी समझा सकता है?

अग्रिम धन्यवाद।

+0

उन पंक्तियों के लिए जिनके लिए सही तालिका अभिव्यक्ति में कोई संबंधित मिलान नहीं है, सही तालिका अभिव्यक्ति के कॉलम में NULL मानों का संदर्भ लेंगे। क्रॉस आवेदन 1 = 1 की अंतर्निहित स्थिति के साथ INNER जॉइन (या एक सहसंबंधित उप-क्वेरी के साथ क्रॉस जॉइन की तरह अधिक सटीक होने के लिए) के बराबर है। –

+0

कृपया इसे देखें: http://explainextended.com/2009/07/16/inner-join-vs-cross-apply/ – CM2K

+0

क्रॉस आवेदन आपको तालिका-मूल्यवान कार्यों के लिए "शामिल" विकल्प देने के लिए डिज़ाइन किया गया था। जब आप दो टेबल/विचारों के साथ काम कर रहे हों, तो जॉइन का उपयोग करना और ['apply'] को सहेजना अधिक उपयुक्त होगा (https://technet.microsoft.com/en-us/library/ms175156 (v = sql.105) .aspx) तालिका-मूल्यवान कार्यों के लिए कीवर्ड। यह भावी संवर्धन या बग फिक्स के लिए स्पष्टता और रखरखाव को बढ़ावा देगा। – DeadZone

उत्तर

5

यदि क्रॉस लागू करने की मेरी समझ सही है तो आपको अलग-अलग परिणाम मिल रहे हैं, यह है कि क्रॉस आवेदन बाएं ऑपरेटर (#temp) में प्रत्येक पंक्ति पर लागू होने के बाद जो भी आता है (दाएं ऑपरेटर) लागू होगा। इसका मतलब है कि परिणाम में पंक्तियों की संख्या #temp में पंक्तियों की संख्या के समान होगी। मेरे जवाब को बंद करना "तालिका-मूल्यवान फ़ंक्शन सही इनपुट के रूप में कार्य करता है और बाहरी तालिका अभिव्यक्ति बाएं इनपुट के रूप में कार्य करती है। बाएं इनपुट से प्रत्येक पंक्ति के लिए सही इनपुट का मूल्यांकन किया जाता है और उत्पादित पंक्तियां अंतिम आउटपुट के लिए संयुक्त होती हैं। " https://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx से।

ध्यान दें कि यदि आप वास्तव में चाहते थे ही आप अपने पार बदल सकता है इस के लिए क्वेरी लागू होने के लिए परिणाम:,

SELECT * 
FROM #temp t1 
     CROSS apply (SELECT Sum(col1) AS col1 
        FROM #temp2 t2 
        WHERE t1.col1 = t2.col1) A 
WHERE A.col1 IS NOT NULL 

यह भी ध्यान रखें कि भीतर शामिल हों होने के लिए परिभाषित किया गया है, जहां दोनों से मेल खाता हो पक्षों। आपके मामले में इसका मतलब है कि केवल 3 पंक्तियां थीं। यदि आपने इसके बजाय बाएं आउटटर का उपयोग किया था तो आप इस मामले में क्रॉस आवेदन के रूप में एक ही परिणाम प्राप्त कर लेते।

+1

धन्यवाद। मैंने स्पष्टीकरण द्वारा नल के साथ हैंडलिंग करते समय क्रॉस के व्यवहार को समझ लिया –

संबंधित मुद्दे