2009-12-30 14 views
5

मैंने कभी नहीं सीखा है कि काम कैसे जुड़ता है लेकिन केवल चयन का उपयोग करके और जहां से किए गए सभी प्रश्नों के लिए जहां खंड पर्याप्त है। क्या ऐसे मामले हैं जहां मुझे WHERE क्लॉज का उपयोग करके सही परिणाम नहीं मिल सकते हैं और मुझे जॉइन का उपयोग करना है? यदि हां, तो क्या कोई उदाहरण प्रदान कर सकता है? धन्यवाद।पूछताछ जो एसक्यूएल शामिल है क्वेरी नहीं कर सकते हैं?

+2

सबसे आसान जवाब यह है: आपको जॉइन के बारे में जानना चाहिए। कई मामलों में, वे आपकी जिंदगी को आसान बना देंगे, भले ही आपकी क्वेरी लिखने का कोई और तरीका हो। –

+1

अब आपके लिए एक बहुत अच्छी बात यह है कि आपके प्रश्नों को दिए गए उत्तरों को स्वीकार करना सीखें जो सही लगते हैं। मुझे लगता है कि उत्तर आपको जरूरी नहीं हैं, या तो दिए गए उत्तरों पर टिप्पणी करें, या एक बक्षीस दें। एमके? –

उत्तर

3

हां। बाहरी जोड़ते समय। आप जुड़ने पर this simple article पढ़ सकते हैं। जॉइन को समझना मुश्किल नहीं है, इसलिए आपको तुरंत सीखना शुरू करना चाहिए (और जहां उचित हो) उनका उपयोग करना चाहिए।

+0

यकीन नहीं है कि यह नकारात्मक क्यों मिला। जवाब मृत है ....... डिफ़ॉल्ट रूप से अंतर्निहित शामिल 'आंतरिक' हैं। इसलिए, पूछताछ करने वाले को विभिन्न प्रकार के विभिन्न प्रकारों को समझने की आवश्यकता है। – tyshock

+0

आज नकारात्मक दिन लगता है। मैंने आज कई प्रश्नों और उत्तरों को संशोधित किया है, जो अन्य लोगों के साथ "यह संशोधित क्यों था" टिप्पणियां पोस्ट कर रहे थे। – jeffa00

0

जब भी आप दो तालिकाओं के परिणामों को गठबंधन करना चाहते हैं तो आपको उनसे जुड़ने की आवश्यकता होगी। उदाहरण के लिए ले लो:

उपयोगकर्ता तालिका:

ID 
FirstName 
LastName 
UserName 
Password 

और पतों तालिका:

ID 
UserID 
AddressType (residential, business, shipping, billing, etc) 
Line1 
Line2 
City 
State 
Zip 

जहां एक ही उपयोगकर्ता अपने घर और अपने व्यापार दिए गए पते (या एक शिपिंग और बिलिंग पते हो सकता था), या बिल्कुल कोई पता नहीं है। एक साधारण WHERE खंड का उपयोग करने से उपयोगकर्ता को कोई पता नहीं मिलेगा क्योंकि पते एक अलग तालिका में हैं। आदेश अब एक उपयोगकर्ता के पतों को लाने के लिए, आप एक के रूप में शामिल करने की आवश्यकता होगी:

SELECT * 
FROM Users 
LEFT OUTER JOIN Addresses 
    ON Users.ID = Addresses.UserID 
WHERE Users.UserName = "foo" 

थोड़ा और अधिक के लिए http://www.w3schools.com/Sql/sql_join.asp देखें अलग की गहराई परिभाषा मिलती है और वे कैसे काम करते हैं।

+0

आपको 'आंतरिक शामिल' का उपयोग करने की आवश्यकता नहीं है। आप इसे 'उपयोगकर्ताओं का चयन करें' के रूप में लिख सकते हैं। * उपयोगकर्ताओं से, पते जहां user.id = पते।उपयोगकर्ता आईडी और उपयोगकर्ता। उपयोगकर्ता नाम = "foo" '। लेकिन यह नीचे दिए गए मेरे उत्तर में बताए गए बाहरी जोड़ों का मामला नहीं है। –

+1

@klausbyskov: वह *** *** एक आंतरिक शामिल है, यह सिर्फ एएनएसआई -8 9 वाक्यविन्यास है। –

+0

मेरा बुरा, गलत उदाहरण में गिरा दिया गया ... इसे अभी तय किया गया: डी –

0

आंतरिक उपयोग डिफ़ॉल्ट रूप से सिंटैक्स में शामिल हो जाता है आंतरिक शामिल होता है। बाहरी जोड़ों को निर्दिष्ट करने के लिए निहित शामिल वाक्यविन्यास को संशोधित करना कभी-कभी संभव होता है, लेकिन यह विक्रेता मेरे अनुभव में निर्भर है (मुझे पता है कि ऑरैकल (-) और (+) नोटेशन है, और मुझे लगता है कि sqlserver * =) का उपयोग करता है। इसलिए, मेरा मानना ​​है कि आंतरिक और बाहरी जुड़ने के बीच अंतर को समझने के लिए आपके प्रश्न को उबाला जा सकता है।

हम बाहरी बनाम एक सरल क्वेरी का उपयोग शामिल हो ..........

अंतर्निहित आंतरिक जोड़ एक आंतरिक के लिए एक सरल उदाहरण देख सकते हैं:

select a.*, b.* 
from table a, table b 
where a.id = b.id; 

ऊपर क्वेरी केवल पंक्तियों को वापस लाएगा जहां 'ए' पंक्ति में 'आईडी' फ़ील्ड के लिए 'बी' में एक मिलान पंक्ति है।

स्पष्ट बाहरी शामिल हों:

select * from 
table a LEFT OUTER JOIN table b 
on a.id = b.id; 

ऊपर क्वेरी वापस, एक में हर पंक्ति लाना होगा या नहीं, यह एक मिलान पंक्ति 'बी' में है। यदि 'बी' के लिए कोई मिलान मौजूद नहीं है, तो 'बी' फ़ील्ड शून्य हो जाएंगे।

इस मामले में, अगर आप पीठ में हर पंक्ति 'एक' परवाह किए बिना कि क्या यह एक इसी 'बी' पंक्ति थी लाना चाहते थे, तो आप बाहरी का उपयोग करने की आवश्यकता होगी में शामिल हो।

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

2

क्या ऐसे मामले हैं जहां मुझे WHERE क्लॉज का उपयोग करके सही परिणाम नहीं मिल सकते हैं और मुझे जॉइन का उपयोग करना है?

जब भी आपकी क्वेरी में दो या दो से अधिक टेबल शामिल होते हैं, तो एक जॉइन का उपयोग किया जा रहा है। This link चित्रों के साथ-साथ नमूना परिणाम सेट में शामिल होने में अंतर दिखाने के लिए बहुत बढ़िया है।

में शामिल होने के मापदंड WHERE खंड में है, तो एएनएसआई -89 में शामिल हों वाक्य रचना के लिए इस्तेमाल किया जा रहा है। एएनएसआई-9 2 प्रारूप में नए जॉइन सिंटैक्स का कारण यह है कि यह विभिन्न डेटाबेसों में बाएं जॉइन को अधिक सुसंगत बना देता है। उदाहरण के लिए, ओरेकल ने (+) का उपयोग किया जो कि वैकल्पिक था, जबकि SQL सर्वर में आपको =* का उपयोग करना पड़ा था।

+0

और SQL सर्वर में निहित में शामिल होने के वाक्य रचना अब वैध नहीं और यहां तक ​​कि पुराने संस्करणों में है, यह गलत परिणाम दे दी है के रूप में यह कभी कभी एक बाहरी के रूप में व्याख्या की गई थी में शामिल होने और कभी कभी एक क्रॉस में शामिल होने के रूप में। – HLGEM

0

का उपयोग करना शामिल:

SELECT a.MainID, b.SubValue AS SubValue1, b.SubDesc AS SubDesc1, c.SubValue AS SubValue2, c.SubDesc AS SubDesc2 
FROM MainTable AS a 
LEFT JOIN SubValues AS b ON a.MainID = b.MainID AND b.SubTypeID = 1 
LEFT JOIN SubValues AS c ON a.MainID = c.MainID AND b.SubTypeID = 2 

ऑफ हाथ, मैं एक साधारण कहां खंड तालिकाओं में शामिल होने का उपयोग करके कि रूप में एक ही परिणाम प्राप्त करने का एक तरीका नहीं देख सकता। इसके अलावा, सामान्य रूप से WHERE में उपयोग किए जाने वाले सिंटैक्स को बाएं और दाएं जुड़ने के लिए क्लोज़ किया जाता है (* = और = *) चरणबद्ध हो रहा है,

+0

(* = और = *) केवल SQL सर्वर में चरणबद्ध नहीं हो रहा है, यह वर्तमान में हमेशा सही परिणाम नहीं देता है। – HLGEM

7

लागू होने वाले 20-वर्ष से अधिक समय में शामिल होते हैं। आप उनके साथ कोड लिखने पर भी विचार क्यों करेंगे?

हाँ, वे समस्याओं कि स्पष्ट मिलती नहीं है बना सकते हैं। SQL सर्वर के बारे में बोलते हुए, बाएं और दाएं अंतर्निहित वाक्यविन्यास में शामिल होने के लिए सही परिणाम वापस करने की गारंटी नहीं है। कभी-कभी, वे बाहरी शामिल होने के बजाय एक क्रॉस जॉइन लौटते हैं। यह बुरी बात है। यह कम से कम SQL Server 2000 पर भी सच था, और उन्हें चरणबद्ध किया जा रहा है, इसलिए उनका उपयोग करना एक खराब अभ्यास है।

दूसरी समस्या निहित मिलती है साथ है कि यह विशेष रूप से जब आप बहुत अधिक तालिकाओं में शामिल हो रहे गलती से, एक क्रॉस जहां शर्तों में से एक भूल से शामिल होने करना आसान है। स्पष्ट जोड़ों का उपयोग करके, यदि आप एक जॉइन स्थिति में शामिल करना भूल जाते हैं तो आपको एक वाक्यविन्यास त्रुटि मिल जाएगी और एक क्रॉस जॉइन को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। दोबारा, यह उन प्रश्नों में परिणाम देता है जो गलत मान लौटाते हैं या क्रॉस जॉइन से छुटकारा पाने के लिए अलग-अलग उपयोग करके तय किए जाते हैं जो सर्वोत्तम रूप से अक्षम होते हैं।

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

मेरा मानना ​​है कि कुछ ORMs भी अब आवश्यकता स्पष्ट मिलती है।

आगे, यदि आप अंतर्निहित जॉइन का उपयोग कर रहे हैं क्योंकि आप समझ नहीं पाते हैं कि कैसे जुड़ते हैं, संभावना है कि आप कोड लिख रहे हैं, वास्तव में, सही परिणाम नहीं लौटाता है क्योंकि आप नहीं जानते कि मूल्यांकन कैसे करें सही परिणाम क्या होगा क्योंकि आप समझ नहीं पाएंगे कि क्या शामिल होना है।

आप किसी भी स्वाद के एसक्यूएल कोड लिखते हैं, वहाँ अच्छी तरह से समझ नहीं मिलती है के लिए कोई बहाना नहीं है।

+0

एफवाईआई, 17 साल = एएनएसआई 92 एसक्यूएल मानक (और 18 साल कल :-) द्वारा अधिग्रहित – gbn

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