ऐसा लगता है कि दो या अधिक तालिकाओं को संयोजित करने के लिए, हम या तो जुड़ने का उपयोग कर सकते हैं या जहां। एक के बाद एक फायदे क्या हैं?
ऐसा लगता है कि दो या अधिक तालिकाओं को संयोजित करने के लिए, हम या तो जुड़ने का उपयोग कर सकते हैं या जहां। एक के बाद एक फायदे क्या हैं?
जवाबों:
किसी भी क्वेरी में एक से अधिक टेबल शामिल हैं, टेबल "ए" से टेबल "बी" के परिणामों को जोड़ने के लिए एसोसिएशन के कुछ रूप की आवश्यकता होती है। ऐसा करने का पारंपरिक (ANSI-89) साधन है:
WHERE क्लॉज में तालिकाओं के बीच सहयोग लिखें
SELECT *
FROM TABLE_A a,
TABLE_B b
WHERE a.id = b.id
यहां ANSI-92 JOIN सिंटैक्स का उपयोग करके फिर से लिखा गया प्रश्न है:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
जहाँ समर्थित (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), अन्य पर सिंटैक्स का उपयोग करने के लिए कोई प्रदर्शन लाभ नहीं है। आशावादी उन्हें एक ही प्रश्न के रूप में देखता है। लेकिन अधिक जटिल प्रश्न ANSI-92 सिंटैक्स का उपयोग करने से लाभ उठा सकते हैं:
ANSI-89 पर ANSI-92 JOIN सिंटैक्स का उपयोग करने के कई कारण हैं:
ANSI-92 JOIN सिंटैक्स पैटर्न है, न कि पैटर्न-विरोधी:
परिचित और / या आराम की कमी, मुझे ANSI-92 JOIN सिंटैक्स के बजाय ANSI-89 WHERE क्लॉज का उपयोग जारी रखने का कोई लाभ नहीं दिखता है। कुछ लोग शिकायत कर सकते हैं कि एएनएसआई -92 सिंटैक्स अधिक क्रिया है, लेकिन यही इसे स्पष्ट करता है। अधिक स्पष्ट, समझने और बनाए रखने में आसान है।
ज्यादातर लोग जोइन सिंटैक्स को थोड़ा स्पष्ट पाते हैं जैसे कि क्या शामिल हो रहा है। इसके अतिरिक्त, यह एक मानक होने का लाभ है।
व्यक्तिगत रूप से, मैं WHEREs पर "बड़ा हुआ" हूं, लेकिन जितना अधिक मैं जॉय सिंटैक्स का उपयोग करता हूं उतना अधिक मैं यह देखना शुरू कर रहा हूं कि मैं और अधिक स्पष्ट कैसे हूं।
जहाँ सिंटैक्स (निहितार्थ के रूप में जाना जाता है अन्य) का उपयोग करने के साथ ये समस्याएं हैं:
सबसे पहले, आकस्मिक क्रॉस जॉइन प्राप्त करना बहुत आसान है, क्योंकि मेज के नामों के आगे सम्मिलित स्थितियां ठीक नहीं हैं। यदि आपके पास 6 तालिकाओं को एक साथ जोड़ा जा रहा है, तो जहां खंड में एक को याद करना आसान है। आप अलग-अलग कीवर्ड का उपयोग करके इस निश्चित को बहुत बार देखेंगे। यह डेटाबेस के लिए आहुंग प्रदर्शन हिट है। आप स्पष्ट ज्वाइन सिंटैक्स का उपयोग करके एक आकस्मिक क्रॉस जॉइन नहीं कर सकते क्योंकि यह सिंटैक्स चेक में विफल हो जाएगा।
कुछ डेटाबेस में पुराने सिंटैक्स में दाएं और बाएं जोड़ समस्याग्रस्त हैं (SQl सर्वर में आपको सही परिणाम प्राप्त करने की गारंटी नहीं है)। इसके अलावा वे SQL सर्वर मुझे पता है में पदावनत हैं।
यदि आप एक क्रॉस जॉइन का उपयोग करने का इरादा रखते हैं, तो यह पुराने सिंटैक्स से स्पष्ट नहीं है। यह वर्तमान एएनएसआईआई मानक का उपयोग करके स्पष्ट है।
अनुरक्षक के लिए यह देखना बहुत कठिन है कि कौन से फ़ील्ड ज्वाइन का हिस्सा हैं या यहां तक कि कौन सी टेबल एक साथ जुड़ती हैं और किस क्रम में इम्प्लांट सिंटैक्स का उपयोग किया जाता है। इसका मतलब है कि प्रश्नों को संशोधित करने में अधिक समय लग सकता है। मैंने बहुत कम लोगों को जाना है, जो एक बार स्पष्ट जुड़ने वाले वाक्य रचना के साथ सहज महसूस करने के लिए समय निकाल लेते हैं, कभी पुराने रास्ते पर लौट जाते हैं।
मैंने यह भी देखा है कि कुछ लोग जो इन निहित जोड़ का उपयोग करते हैं, वे वास्तव में यह नहीं समझते हैं कि कैसे काम में शामिल होता है और इस प्रकार उनके प्रश्नों में गलत परिणाम मिल रहे हैं।
ईमानदारी से, क्या आप किसी अन्य प्रकार के कोड का उपयोग करेंगे जो 18 साल पहले एक बेहतर विधि के साथ बदल दिया गया था?
स्पष्ट जुड़ाव इरादे को जोड़ता है, जहां फ़िल्टर करने के लिए क्लॉज को छोड़कर। यह क्लीनर है और यह मानक है, और आप बाएं बाहरी या दाएं बाहरी जैसे काम कर सकते हैं जो केवल जहां करना मुश्किल है।
आप दो तालिकाओं के संयोजन के लिए WHERE का उपयोग नहीं कर सकते। लिखने के लिए आप क्या कर सकते हैं:
SELECT * FROM A, B
WHERE ...
यहाँ अल्पविराम लेखन के बराबर है:
SELECT *
FROM A
CROSS JOIN B
WHERE ...
क्या आप लिखेंगे? नहीं - क्योंकि यह वह नहीं है जो आप बिल्कुल मतलब है। आप एक क्रॉस जॉइन नहीं करना चाहते हैं, आप एक INNER JOIN चाहते हैं। लेकिन जब आप कॉमा लिखते हैं, तो आप क्रोस जॉइन कह रहे हैं और यह भ्रामक है।
वास्तव में आपको अक्सर "WHERE" और "JOIN" दोनों की आवश्यकता होती है।
"JOIN" का प्रयोग दो कॉलम के डेटा को पुनः प्राप्त करने के लिए किया जाता है - एक सामान्य कॉलम के मूल्यों पर आधारित। यदि आप इस परिणाम को और फ़िल्टर करना चाहते हैं, तो WHERE क्लॉज़ का उपयोग करें।
उदाहरण के लिए, "LEFT JOIN" बाईं तालिका से सभी पंक्तियों को पुनर्प्राप्त करता है, साथ ही दाईं तालिका से मिलान पंक्तियाँ। लेकिन यह किसी विशिष्ट मूल्य या अन्य स्तंभों पर रिकॉर्ड को फ़िल्टर नहीं करता है जो JOIN का हिस्सा नहीं हैं। इस प्रकार, यदि आप इस परिणाम को आगे फ़िल्टर करना चाहते हैं, तो WHERE क्लॉज में अतिरिक्त फ़िल्टर निर्दिष्ट करें।