2009-07-07 9 views
6

मुझे शायद अब तक यह पता होना चाहिए, लेकिन क्या, यदि नीचे दिए गए दो बयानों के बीच कोई अंतर है?एसक्यूएल - इनके बीच अंतर?

नेस्टेड में शामिल होने:

SELECT 
    t1.* 
FROM 
    table1 t1 
    INNER JOIN table2 t2 
     LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID 
    ON t2.table2_ID = t1.table1_ID 

अधिक परंपरागत में शामिल हों:

SELECT 
    t1.* 
FROM 
    table1 t1 
    INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID 
    LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID 
+0

क्या आप उन्हें निष्पादित करते समय वही परिणाम देते हैं? –

+0

मुझे जाने के लिए +1 "एचएम ..." – Tomalak

+0

यह पहले की तुलना में दूसरे को समझना बहुत आसान है - भले ही आप पहले व्यक्ति में LOJ के आस-पास (माता-पिता) डाल दें। इस पर एक अच्छा जवाब वोट करने के लिए तत्पर हैं। –

उत्तर

5

खैर, यह है

SELECT 
    t1.* 
FROM 
     table1 t1              -- inner join t1 
    INNER JOIN 
     (table2 t2 LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID) -- with this 
    ON t2.table2_ID = t1.table1_ID          -- on this condition 

तो मूल रूप से, पहले आप बाईं t3 साथ t2 शामिल हों शामिल होने के स्थिति के आधार पर,: आपरेशन के आदेश ..

SELECT 
    t1.* 
FROM 
    table1 t1 
    INNER JOIN table2 t2 
     LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID 
    ON t2.table2_ID = t1.table1_ID 

के रूप में लिखा जा सकता है table3_ID = table2_ID, तो आप आंतरिक शामिल हों t1 table2_ID = table1_ID पर t2 के साथ।

अपने दूसरे उदाहरण में आप पहली बार INNER टी 1 के साथ टी 1 में शामिल हों, और उसके बाद परिणामस्वरूप आंतरिक तालिका तालिका 3_ID = table1_ID पर तालिका t3 के साथ जुड़ें।

SELECT 
    t1.* 
FROM 
     (table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join 
    LEFT JOIN               -- then left join 
     table3 t3 ON t3.table3_ID = t2.table2_ID      -- the result with this 

संपादित

मैं माफी माँगता हूँ: के रूप में

SELECT 
    t1.* 
FROM 
    table1 t1 
    INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID 
    LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID   

फिर से लिखा जा सकता है। मेरी पहली टिप्पणी गलत थी। दो प्रश्न एक ही परिणाम उत्पन्न करेंगे लेकिन प्रदर्शन में कोई अंतर हो सकता है क्योंकि पहली क्वेरी कुछ मामलों में दूसरी क्वेरी की तुलना में धीमी गति से प्रदर्शन कर सकती है (जब तालिका 1 में केवल तालिका 2 में तत्वों का सबसेट होता है) बाएं जॉइन के रूप में पहले निष्पादित किया जाना चाहिए - और केवल तब table1 के साथ छेड़छाड़ की। दूसरी क्वेरी के विपरीत जो क्वेरी ऑप्टिमाइज़र को यह काम करने की अनुमति देता है।

+1

स्पष्ट रूप से संचालन का क्रम अलग है, लेकिन क्या कोई वास्तविक अंतर है (प्रदर्शन, परिणाम, कुछ भी)? –

+1

कृपया डेटा का एक उदाहरण दें जहां प्रश्न अलग-अलग परिणाम लौटाएंगे। मैं कोई भी उत्पन्न करने में सक्षम नहीं था। –

+0

ठीक है, इन लोगों के विचारों के लिए धन्यवाद। यह तब तक बहुत सुंदर था जैसा मैंने सोचा था। परिणाम वही होंगे, लेकिन प्रश्न अलग-अलग प्रदर्शन कर सकते हैं। मुझे लगता है कि आसानी से उपयोग के लिए, मैं अधिक पारंपरिक वाक्यविन्यास का उपयोग करने के लिए पुरानी (नेस्टेड) ​​क्वेरी बदल दूंगा। – TehOne

4

अपने विशिष्ट उदाहरण के लिए, मुझे नहीं लगता कि क्वेरी योजनाओं में कोई अंतर नहीं होना चाहिए उत्पन्न, लेकिन निश्चित रूप से पठनीयता में एक अंतर है। आपका दूसरा उदाहरण पालन करना बहुत आसान है।

यदि आप उदाहरण में शामिल होने के प्रकारों को उलटना चाहते हैं, तो आप बहुत अलग परिणामों के साथ समाप्त हो सकते हैं।

SELECT t1.* 
FROM table1 t1 
    LEFT JOIN table2 t2 ON t2.table2_ID = t1.table1_ID 
    INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID 

-- may not produce the same results as... 

SELECT t1.* 
FROM table1 t1 
    LEFT JOIN table2 t2 
     INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID 
    ON t2.table2_ID = t1.table1_ID 

तथ्य यह है कि मिलती है के आदेश कई मामलों में फर्क पड़ता है के आधार पर - सावधान सोचा कि कैसे आप अपने वाक्य रचना में शामिल होने लिख रहे हों जाना चाहिए। यदि आप पाते हैं 2 उदाहरण क्या तुम सच में पूरा करने के लिए कोशिश कर रहे हैं कि, तो मैं क्वेरी दोबारा लिखना होगा ताकि आप अपने मिलती के आदेश पर अधिक जोर डाल सकते हैं पर विचार करेंगे ...

SELECT t1.* 
FROM table2 t2 
     INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID 
     RIGHT JOIN table1 t1 ON t2.table2_ID = t1.table1_ID 
2

इन दोनों प्रश्नों में क्या भिन्न है यह देखने का सबसे अच्छा तरीका इन दोनों प्रश्नों के लिए क्वेरी योजना की तुलना करना है।

इन के लिए परिणाम सेट में कोई अंतर नहीं है IF तालिका 2 में दी गई पंक्ति के लिए तालिका 3 में हमेशा पंक्तियां होती हैं।

मैंने इसे अपने डेटाबेस पर करने की कोशिश की और क्वेरी योजनाओं में अंतर यह था कि 1. पहली क्वेरी के लिए, ऑप्टिमाइज़र ने पहले तालिका 2 और तालिका 3 में शामिल होना चुना। 2।दूसरी क्वेरी के लिए, ऑप्टिमाइज़र ने पहले table1 और table2 में शामिल होना चुना।

+0

मेरे लिए, मेरे वास्तविक प्रश्नों के लिए निष्पादन योजना बिल्कुल वही थी। – TehOne

0

आपको दो प्रश्नों के बीच कोई अंतर नहीं दिखाना चाहिए, बशर्ते आपका डीबीएमएस 'ऑप्टिमाइज़र खरोंच तक हो। हालांकि, यहां तक ​​कि बड़े लोहा, उच्च लागत वाले प्लेटफार्मों के लिए भी एक धारणा नहीं है, मुझे विश्वास करने में विश्वास होगा, इसलिए मैं उन प्रश्नों की योजनाओं (और इसके परिणामस्वरूप निष्पादन के समय) को खोजने के लिए काफी असुरक्षित हूं।

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