पुराने सिंटैक्स, तालिकाओं को सूचीबद्ध करने, और WHERE
शामिल होने के मानदंडों को निर्दिष्ट करने के लिए क्लॉज का उपयोग करते हुए , अधिकांश आधुनिक डेटाबेस में चित्रित किया जा रहा है।
यह केवल दिखाने के लिए नहीं है, पुराने वाक्यविन्यास में अस्पष्ट होने की संभावना है जब आप एक ही क्वेरी में INNER और OUTER दोनों का उपयोग करते हैं।
मैं आपको एक उदाहरण देता हूं।
मान लीजिए कि आपके सिस्टम में 3 टेबल हैं:
Company
Department
Employee
प्रत्येक तालिका में कई पंक्तियाँ होती हैं, जो एक साथ जुड़ी होती हैं। आपको कई कंपनियां मिलीं, और प्रत्येक कंपनी में कई विभाग हो सकते हैं, और प्रत्येक विभाग में कई कर्मचारी हो सकते हैं।
ठीक है, तो अब आप निम्नलिखित करना चाहते हैं:
सभी कंपनियों को सूचीबद्ध करें, और उनके सभी विभागों, और उनके सभी कर्मचारियों को शामिल करें। ध्यान दें कि कुछ कंपनियों के पास अभी तक कोई विभाग नहीं है, लेकिन सुनिश्चित करें कि आप उन्हें भी शामिल करें। सुनिश्चित करें कि आप केवल उन विभागों को पुनः प्राप्त करते हैं जिनके पास कर्मचारी हैं, लेकिन हमेशा सभी कंपनियों को सूचीबद्ध करें।
तो आप ऐसा करें:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
ध्यान दें कि अंतिम एक आंतरिक जुड़ाव है, जो कि उन मानदंडों को पूरा करने के लिए है जो आप केवल लोगों के साथ विभाग चाहते हैं।
ठीक है, तो अब क्या होता है। खैर, समस्या यह है, यह डेटाबेस इंजन, क्वेरी ऑप्टिमाइज़र, इंडेक्स और टेबल सांख्यिकी पर निर्भर करता है। मुझे समझाने दो।
यदि क्वेरी ऑप्टिमाइज़र यह निर्धारित करता है कि ऐसा करने का तरीका पहले एक कंपनी लेना है, तो विभागों को ढूंढें, और फिर कर्मचारियों के साथ एक आंतरिक जुड़ाव करें, आपको कोई भी ऐसी कंपनी नहीं मिलने वाली है जिसके पास विभाग नहीं हैं।
इसका कारण यह है कि WHERE
खंड यह निर्धारित करता है कि कौन से पंक्तियाँ अंतिम परिणाम में समाप्त होती हैं , न कि पंक्तियों के अलग-अलग हिस्सों में।
और इस मामले में, बाईं ओर शामिल होने के कारण, विभाग .ID कॉलम NULL होगा, और इस प्रकार जब यह कर्मचारी के लिए ININ JOIN की बात आती है, तो कर्मचारी पंक्ति के लिए उस बाधा को पूरा करने का कोई तरीका नहीं है, और इसलिए यह नहीं है दिखाई देते हैं।
दूसरी ओर, यदि क्वेरी ऑप्टिमाइज़र पहले विभाग-कर्मचारी से जुड़ने का निर्णय लेता है, और फिर कंपनियों के साथ एक बाईं ओर जुड़ता है, तो आप उन्हें देखेंगे।
तो पुराना वाक्यविन्यास अस्पष्ट है। क्वेरी संकेत से निपटने के बिना, आप क्या चाहते हैं, यह निर्दिष्ट करने का कोई तरीका नहीं है और कुछ डेटाबेस में कोई रास्ता नहीं है।
नया सिंटैक्स दर्ज करें, इसके साथ आप चुन सकते हैं।
उदाहरण के लिए, यदि आप सभी कंपनियों को चाहते हैं, जैसा कि समस्या विवरण में कहा गया है, तो यह वही है जो आप लिखेंगे:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
यहां आप यह निर्दिष्ट करते हैं कि आप चाहते हैं कि विभाग-कर्मचारी जुड़कर एक के रूप में किया जाए, और फिर कंपनियों के साथ उस के परिणामों में शामिल हों।
इसके अतिरिक्त, मान लें कि आप केवल ऐसे विभाग चाहते हैं जिनमें उनके नाम के अक्षर X हों। फिर से, पुरानी शैली के साथ जुड़ने पर, आप कंपनी को खोने का जोखिम उठाते हैं, अगर उसके नाम में X के साथ कोई विभाग नहीं है, लेकिन नए सिंटैक्स के साथ, आप यह कर सकते हैं:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
यह अतिरिक्त खंड जुड़ने के लिए उपयोग किया जाता है, लेकिन पूरी पंक्ति के लिए फ़िल्टर नहीं है। तो पंक्ति कंपनी की जानकारी के साथ दिखाई दे सकती है, लेकिन उस पंक्ति के लिए सभी विभाग और कर्मचारी कॉलम में NULL हो सकते हैं, क्योंकि उस कंपनी के लिए उसके नाम में X के साथ कोई विभाग नहीं है। पुराने सिंटेक्स के साथ यह कठिन है।
यही कारण है कि, अन्य विक्रेताओं के बीच, Microsoft ने SQL सर्वर 2005 और उसके बाद के पुराने पुराने सम्मिलित वाक्य-विन्यास को नहीं, बल्कि पुराने आंतरिक सम्मिलित वाक्य-विन्यास को चित्रित किया है। Microsoft SQL Server 2005 या 2008 पर चल रहे डेटाबेस से बात करने का एकमात्र तरीका पुरानी शैली के बाहरी सिंटैक्स का उपयोग करके, उस डेटाबेस को 8.0 संगतता मोड (उर्फ SQL सर्वर 2000) में सेट करना है।
इसके अतिरिक्त, पुराने तरीके, क्वेरी ऑप्टिमाइज़र पर तालिकाओं का एक गुच्छा फेंककर, जहां WHERE क्लॉज़ के एक समूह के साथ, "आप यहाँ हैं, सबसे अच्छा आप कर सकते हैं" कहने के लिए समान था। नए सिंटैक्स के साथ, क्वेरी ऑप्टिमाइज़र के पास यह जानने के लिए कम काम होता है कि कौन से भाग एक साथ चलते हैं।
इसलिए यह अब आपके पास है।
LEFT और INNER JOIN भविष्य की लहर है।