2010-07-18 12 views
8

की कमी मैं अभी भी नेटिन जॉइन/यूएसइंग - एसक्यूएल 9 2 फीचर्स पर पढ़ रहा हूं जो SQL सर्वर के वर्तमान प्रदर्शन से गायब हैं (दुख की बात है?)।एसक्यूएल सर्वर - प्राकृतिक जॉइन/एक्स जॉइन वाई यूइंग (फ़ील्ड)

क्या कोई भी डीबीएमएस से आया है जो इन्हें एसक्यूएल सर्वर (या अन्य गैर-सहायक डीबीएमएस) में समर्थित करता है - क्या वे ध्वनि के रूप में उपयोगी थे, या कीड़े (जैसे यह भी संभव लगता है!)?

उत्तर

15

मैं कभी भी NATURAL JOIN का उपयोग नहीं करता क्योंकि मुझे यह संभावना पसंद नहीं है कि शामिल कुछ ऐसा कर सकता है जिसका मैं इरादा नहीं रखता क्योंकि दोनों कॉलम नाम दोनों तालिकाओं में मौजूद हैं।

मैं USING कभी-कभी वाक्य रचना में शामिल होने का उपयोग करते हैं, लेकिन बस के रूप में अक्सर यह पता चला है कि मैं एक और अधिक जटिल USING से हालत का समर्थन कर सकते में शामिल होने की जरूरत है, तो मैं सब के बाद बराबर ON वाक्य रचना करने के लिए इसे परिवर्तित कि।

+0

+1। – Fosco

+0

मैं 'प्राकृतिक जॉइन' के साथ एक ही पंक्ति के साथ सोच रहा था - यह अच्छा होगा अगर इसके बाद इस प्रकार के प्रकार में कुछ 'विदेशी कुंजी' शामिल हो (जैसा कि यह खड़ा है, 'प्राकृतिक जॉइनिंग टेबल जैसे कि हटाए गए कॉलम गैरकानूनी होंगे)। धन्यवाद बिल –

+0

काफी। इस बिंदु को अनदेखा करने के लिए एक तालिका में कॉलम जोड़ना और एक ऐसी स्थिति बनाने में आसान है जहां कोई इरादा नहीं था (वह कहता है, कई मौकों पर ठीक से किया गया है)। –

1

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

रखरखाव के लिए स्पष्ट होना भी बेहतर है, इसके अलावा विकल्प परिस्थितियों से निपटने के लिए बहुत सीमित हो सकते हैं। मैं अपने कोडबेस को सुसंगत भी पसंद करूंगा।

+0

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

2

संबंधित तो सवाल: is NATURAL JOIN any better than SELECT FROM WHERE in terms of performance ?

एक प्राकृतिक शामिल हों एक आसान शॉर्टकट नहीं है: यह पूरी तरह खतरनाक है। यह डीबीएमएस में काफी दुर्लभ है।

उपयोग स्पष्ट है, लेकिन इसकी सीमाएं दी गई हैं, आप इसे हर जगह उपयोग नहीं कर सकते हैं, इसलिए निरंतर होगा, नहीं?

+0

प्राकृतिक जॉइन कुछ बहुत प्राकृतिक (पन क्षमा करें) करने के लिए एक आदर्श शॉर्टकट है। यदि आपको नहीं पता कि कॉलम का नाम कैसे दिया गया है, तो कुछ कॉलम में स्पष्ट रूप से शामिल होने वाले ऑपरेशन को प्रतिबंधित करने के लिए उपयोग करना बेहतर हो सकता है। –

8

आप एक डीबीएमएस है कि वास्तव में रिलेशनल ?:

ट्यूटोरियल डी [वास्तव में एक संबंधपरक भाषा] में

, केवल "में शामिल होने के" ऑपरेटर JOIN कहा जाता है था पर विचार करेंगे, और इसका मतलब है "प्राकृतिक में शामिल होने के "... कोई अन्य प्रकार शामिल होना चाहिए ... कुछ लोगों के पास उचित संबंधपरक भाषा का उपयोग करने का अनुभव होना चाहिए। जो लोग है, मैं दृढ़ता से संदेह है कि में से कोई भी उन्हें कभी कुछ कथित असुविधा के बारे में जोड़ी कॉलम में उनके नाम के अनुसार

स्रोत शिकायत की: ह्यूग डार्वेन द्वारा "The Importance of Column Names"

+0

अच्छी जानकारी। प्राकृतिक जॉइन यह समझाने के लिए एक सही कारण की तरह लगता है कि कोई शुद्ध आरडीबीएमएस क्यों नहीं है ... – gbn

1

यह बात है सुविधा का अनिवार्य नहीं, लेकिन इसकी जगह होनी चाहिए, उदाहरण के लिए इंटरैक्टिव क्वेरीिंग (प्रत्येक कीस्ट्रोक हमें आरएसआई के करीब लाती है), या उत्पादन कोड में हाथ से लिखे गए एसक्यूएल के कुछ साधारण मामलों (हाँ, मैंने लिखा है। और गंभीर कोड में JOIN USING भी देखा, जो मेरे अलावा बुद्धिमान प्रोग्रामर द्वारा लिखे गए हैं। लेकिन, मैं digressing)।

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

-- foreign key "order".customerId references (customer.id) 
SELECT c.*, c.id as customerId, o.* from customer c 
join "order" o using (customerId); 

मैं से सहमत नहीं हूं:

क्या JOIN USING वाक्य रचना में अच्छा है, कि यह सिर्फ स्तंभ नाम पर नहीं काम करता है, लेकिन यह भी स्तंभ उपनाम पर, उदाहरण के लिए है "उपयोग में शामिल हों बेहतर होगा, अगर केवल (...)"। या तर्क, कि आपको अधिक जटिल स्थितियों की आवश्यकता हो सकती है। एक अलग दृष्टिकोण से, JOIN ON का उपयोग क्यों करें? शुद्ध क्यों नहीं है, और सभी शर्तों को WHERE खंड में ले जाएं?

SELECT t1.*, t2.* from t1, t2 where t2.t1_id = t1.id; 

मैं अब पागल हो जाना और बहस कर सकते, यह कैसे एक में शामिल होने व्यक्त करने के लिए स्पष्ट तरीका है, और आप तुरंत जहां खंड है, जो आप आमतौर पर वैसे भी, ऐसा ऐसा जरूरत से अधिक शर्तों को जोड़ने शुरू कर सकते हैं ..

तो आपको इस विशेष वाक्यविन्यास को बहुत ही याद नहीं करना चाहिए, लेकिन इसे रखने के लिए खुश होने के लिए कुछ भी नहीं है ("पुhew, जो करीब था। इतना अच्छा नहीं है कि हम शामिल हों। मुझे बहुत बचा था दर्द का ")।

तो, जबकि मैं व्यक्तिगत रूप से समय की JOIN ON 99% का उपयोग करें, मैं कोई Schadenfreude लगता है जब है वहाँ कोई JOIN USING या NATURAL JOIN। ऑन सिंटैक्स के साथ चिपकने के लिए

+0

कोड में बैकटिक्स (जैसे \ \ order \ ') का उपयोग करने से बचें। यह आईएसओ एसक्यूएल मानक का उसी तरह से उल्लंघन करता है [आदेश] करता है। मानक केवल आदेश और "आदेश" (निश्चित रूप से अलग अर्थ) जानता है। –

+0

आप सही हैं - मैंने सोचा कि यह बिना किसी रिडेम्प्शन के एक असंगतता नरक था, लेकिन अब मुझे लगता है कि SQL सर्वर में 'QUOTED_IDENTIFIER' है और MySQL में' ANSI_QUOTES' है। देखें: http://stackoverflow.com/questions/10573922/what-does-the-sql- मानक-say-about-usage-of-backtick –

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