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