2009-05-04 13 views
5

निम्नलिखित दो प्रश्नों अलग परिणाम लौट रहे हैं, मेरे आश्चर्य:एसक्लाइट में एकाधिक जॉइन स्टेटमेंट की प्राथमिकता क्या है?

SELECT * 
    FROM foo 
     JOIN bar 
     ON bar.id=foo.bar_id 

     JOIN baz 
     ON baz.id=foo.baz_id 

     LEFT JOIN zig 
     ON zig.foo_id=foo.id; 

और:

SELECT * 
    FROM foo 
     LEFT JOIN zig 
     ON zig.foo_id=foo.id 

     JOIN bar 
     ON bar.id=foo.bar_id 

     JOIN baz 
     ON baz.id=foo.baz_id; 

मैं कल्पना है कि यह नहीं बात आप जब LEFT JOINzig पर, के बाद से मैं चाहिए कर रहा हूँ bar और baz में शामिल होने पर zig के कॉलम का उपयोग नहीं कर रहा हूं। हालांकि, ऐसा लगता है कि बाद में, JOINbar और baz की पंक्तियों को निगलती है जहां zignull मान थे ... वह क्यों है?

+0

मुझे संदेह है कि यह मेरी समस्या का एक गलत सरलीकरण था - उन दो प्रश्नों को वास्तव में समान होना चाहिए, मैं कुछ और कर रहा था। –

उत्तर

3

यह ठीक काम करता है। मैं गलत था।

2

ये आपके अलग-अलग बयान में शामिल होने के कारण अलग हैं। याद रखें कि जुड़ें केवल उन दो तालिकाओं पर नहीं हैं जिन पर आप फ़ील्ड की तुलना कर रहे हैं, बल्कि उस बिंदु और अगली तालिका में जो कुछ भी आप शामिल हो गए हैं।

तो पहले बयान आप में foo से पंक्तियों को छान कर रहे हैं में अपने पहले में शामिल होने के (उन की जरूरत नहीं है कि bar_id = bar.id)

लेकिन दूसरे बयान में आप अपने बाएँ साथ foo के सभी शामिल कर रहे हैं में शामिल हो।

जब मैंने इसे लिखना शुरू किया, तो मुझे अनुमान लगाया गया कि यह अनुमान लगाया गया था, अगर मुझे यह समझ में आता है तो मुझे बताएं।

+1

लेकिन अगर दूसरे कथन में, मैं पहले बाएं शामिल होने के साथ सभी foo समेत हूं, तो वही पंक्तियां नहीं होनी चाहिए (जिनके पास बार_आईड नहीं है) बाद में शामिल हो जाएं? –

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