2009-03-10 11 views
9

मैं निम्नलिखित अनुरोध मिल गया है:क्या मुझे एकाधिक तालिकाओं पर जटिल जुड़ने के लिए एसक्यूएल जॉइन कीवर्ड का उपयोग करना चाहिए?

select * 
    from tbA A, tbB B, tbC C, tbD D 
where 
    A.ID=B.ID and B.ID2= C.ID2 and A.ID=D.ID and C.ID3=D.ID3 and B.ID4=D.ID4 
and 
    A.Foo='Foo' 

मैं कई बार है कि इस में शामिल होने के वाक्य रचना का मूल्यह्रास हुआ है सुना है, और मैं 'में शामिल हों' कीवर्ड के उपयोग करना होगा।

मैं इस तरह के जटिल जुड़ाव में कैसे कर सकता हूं (विभिन्न तालिकाओं से जुड़े कई कॉलम पर एकाधिक टेबल शामिल हो गए हैं)? क्या आपको लगता है कि यह सर्वोत्तम अभ्यास अभी भी लागू होता है?

+0

एएनएसआई प्रारूप का उपयोग कर के बारे में अच्छी बात यह है कि में शामिल होने के तर्क अपने छानने तर्क से अलग किया जाता है। यह देखने के लिए बहुत स्पष्ट करता है कि तालिकाओं को एक नज़र में कैसे संबंधित किया जाता है। – Barry

+0

हां, यह बहिष्कृत है।और हाँ आपको अपना एसक्यूएल साफ़ करना चाहिए। – NotMe

+0

@ क्रिस: ठीक है, ऐसा लगता है कि इस वाक्यविन्यास का उपयोग बहिष्कृत नहीं किया गया है, जबकि * (बाएं जुड़ने के लिए) का उपयोग है (यह किसी अन्य उत्तर में विस्तृत है)। एसक्यूएल फिर से, मैंने इसे एक उदाहरण के रूप में लिखा है – Brann

उत्तर

10

यह स्वाद का विषय है, लेकिन मुझे जॉइन कीवर्ड बेहतर पसंद है। यह तर्क स्पष्ट बनाता है और बाएं बाहरी जॉइन सिंटैक्स के साथ अधिक संगत है जो इसके साथ जाता है। ध्यान दें कि आप इनर जॉइन का भी उपयोग कर सकते हैं जो जॉइन के समानार्थी है।

वाक्य रचना

a JOIN b 
    ON expression relating b to all of the tables before 

ख एक ही शामिल हो हो सकता है। भीतरी के लिए मिलती है यह कोई बात नहीं है, लेकिन इस तरह मिलती बाहरी के लिए आप नियंत्रित कर सकते हैं:

select * from 
    a left join 
     d join c 
     on d.i = c.i 
    on a.k = d.k 

यहाँ एक बाएं में शामिल हो गए है के बीच घ और ग भीतरी शामिल होने के लिए।

यहाँ आपकी क्वेरी है:

select * 
    from tbA A 
    join tbB B on A.ID = B.ID 
    join tbC C on B.ID2 = C.ID2 
    join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4 
where 
    A.Foo='Foo' 
5

मैं वाक्य रचना बहुत आसान में शामिल होने को समझने के लिए

select * 
from tbA A 
inner join tbB B on a.id = b.id 
inner join tbC C on b.id2 = c.id2 
inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4 
where A.Foo='Foo' 

अब आप स्पष्ट रूप से देख सकते हैं कि डेटा एक साथ शामिल हो गए हैं और है कि यह एक बहुत जटिल नहीं है में शामिल होने के लिए पूरी तरह लगता है।

बीटीडब्ल्यू, आपके उदाहरण में डेटाबेस डिज़ाइन दृढ़ता से सामान्यीकरण की कमी की गंध करता है। आम तौर पर आपके पास या तो कई में शामिल होने वाली एक तालिका होनी चाहिए (a.bid = b.bid पर c में शामिल हों c.id = c.cid पर c शामिल हों) या एक श्रृंखला (a.bid = b.bid पर शामिल हों b b.cid = c.cid पर)।

संपादित करें। वैकल्पिक कीवर्ड INNER जोड़ा गया जो परिणाम नहीं बदलता है, लेकिन इसे और अधिक स्पष्ट करता है।

+0

क्या आपने उद्देश्य पर दो बार 'a.id = b.id' दोहराया था? – Brann

+0

यह a.id = d.id3 होना चाहिए। –

+0

वास्तव में यह a.id = d.id होना चाहिए :) पोस्ट सही किया गया। बीटीडब्ल्यू, नामकरण के साथ यह सरल समस्या स्पष्ट रूप से दिखाती है कि डिज़ाइन सही क्यों नहीं है। – user76035

2
SELECT * 
FROM tba AS a 
    JOIN tbb AS b ON a.id = b.id 
    JOIN tbc AS c ON b.id2 = c.id2 
    JOIN tbd AS d ON a.id = d.id AND c.id3 = d.id3 AND b.id4 = d.id4 
WHERE 
    a.foo = 'Foo' 

हालांकि मुझे इसके लिए किसी भी आवश्यकता की कल्पना करने में कठिनाई हो रही है। एक उदाहरण देने के लिए हिम्मत, या अधिक वर्णनात्मक तालिका नाम?

2

JOIN वाक्य रचना जो ज्यादा महत्वपूर्ण है, संभाल कर सकते हैं INNER और OUTER और अधिक स्पष्ट तरीके से जुड़ जाता है (हालांकि मैं व्यक्तिगत रूप से सरल मामलों में WHERE वाक्य रचना पसंद करते हैं) अधिक स्पष्ट है, और,।

WHERE बहिष्कृत नहीं किया गया है और शायद कभी नहीं होगा।

यह केवल एक अर्थ में बहिष्कृत है कि विभिन्न OUTER JOIN वर्कअराउंड (जैसे (*) और (+)) बहिष्कृत हैं।

ऐसा कुछ भी नहीं है जिसे आप JOIN के साथ नहीं कर सकते हैं, जो आप WHERE के साथ कर सकते हैं, लेकिन इसके विपरीत नहीं।

+0

दरअसल। अब मुझे एक संदेश में * उपयोग करते समय यह संदेश देखना याद है – Brann

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