दिलचस्प पोस्ट
जावास्क्रिप्ट में शब्द कटाई के बिना स्ट्रिंग को छोटा करें आईओएस एवी फाउंडेशन: मैं एक एमपी 3 फाइल से कलाकृति कैसे लाऊं? आखिरी महीने में एक शाखा में सभी गतिविधियों को कैसे उजागर करना है? पायथन धारावाहिक वस्तुएं जेसन PHP रूट निर्देशिका में एक txt फ़ाइल बनाएँ और सहेजें Android में चैट बबल बनाएं एंड्रॉइड Geofence अंत में संक्रमण इरादों हो रही बंद करो सी संरचना स्मृति लेआउट? विस्तारित वर्ग के भीतर से 'इस' कीवर्ड को एक्सटेंशन विधि को कॉल करने की आवश्यकता क्यों है? सेलेनियम 2 में ड्रॉप डाउन विकल्प का चयन कैसे करें विंडोज में 2 बाइनरी फाइलों की तुलना करने के लिए उपकरण <? ?> टैग PHP 5.3.1 में काम नहीं कर रहा है स्वतंत्र चार *: अमान्य अगले आकार (तेज़) विधि मिलान अच्छी तरह से काम नहीं करते एक HTTP प्रॉक्सी – पायथन का उपयोग करना

एक ही मेज पर दो बार शामिल होने का सबसे अच्छा तरीका क्या है?

यह थोड़ा जटिल है, लेकिन मेरे पास 2 टेबल हैं मान लें कि संरचना कुछ ऐसा है:

*Table1* ID PhoneNumber1 PhoneNumber2 *Table2* PhoneNumber SomeOtherField 

तालिकाओं को टेबल 1 पर आधारित जोड़ा जा सकता है। फ़ोन नंबर 1 -> टेबल 2। फ़ोन नंबर, या तालिका 1। फ़ोन नंबर 2 -> टेबल 2। फ़ोन नंबर

अब, मैं एक नतीजा प्राप्त करना चाहता हूं जिसमें फ़ोन नंबर 1, कुछ ऑथरफिल्ड फोननंबर 1, फोन नंबर 2, और कुछ अन्य फ़ील्ड से मेल खाती है जो फोन नंबर 2 से मेल खाती है।

मैंने ऐसा करने के दो तरीकों के बारे में सोचा – या तो मेज पर दो बार शामिल होने के साथ, या एक बार या ओ में सेक्शन में शामिल होने से।

विधि 1 :

 SELECT t1.PhoneNumber1, t1.PhoneNumber2, t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2 FROM Table1 t1 INNER JOIN Table2 t2 ON t2.PhoneNumber = t1.PhoneNumber1 INNER JOIN Table2 t3 ON t3.PhoneNumber = t1.PhoneNumber2 

यह काम करने लगता है

विधि 2 :

किसी भी तरह एक क्वेरी है जो इस तरह से थोड़ा सा दिखता है –

 SELECT ... FROM Table1 INNER JOIN Table2 ON Table1.PhoneNumber1 = Table2.PhoneNumber OR Table1.PhoneNumber2 = Table2.PhoneNumber 

मुझे अभी तक काम करने के लिए इसे नहीं मिला है और मुझे यकीन नहीं है कि ऐसा करने का एक तरीका है।

यह पूरा करने का सबसे अच्छा तरीका क्या है? कोई भी तरीका सरल या सहज नहीं लगता … क्या ऐसा करने के लिए कोई और अधिक सरल तरीका है? यह आवश्यकता आम तौर पर कैसे लागू की जाती है?

Solutions Collecting From Web of "एक ही मेज पर दो बार शामिल होने का सबसे अच्छा तरीका क्या है?"

सबसे पहले, मैं इन टेबलों को प्राकृतिक कुंजी के रूप में फोन नंबरों का उपयोग करने से दूर करने की कोशिश करूँगा। मैं प्राकृतिक कुंजियों के प्रशंसक नहीं हूं और यह एक बढ़िया उदाहरण है, क्यों प्राकृतिक कुंजियां, विशेष रूप से फोन नंबर जैसी चीजें, बदल सकती हैं और बार-बार ऐसा कर सकती हैं। जब यह परिवर्तन होता है, तब आपके डेटाबेस को अपडेट करना एक बड़ा, त्रुटि-प्रवण सिरदर्द होगा *

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

मैं सिर्फ चीजों को थोड़ा सा साफ कर दूंगा:

 SELECT t.PhoneNumber1, t.PhoneNumber2, t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2 FROM Table1 t JOIN Table2 t1 ON t1.PhoneNumber = t.PhoneNumber1 JOIN Table2 t2 ON t2.PhoneNumber = t.PhoneNumber2 

मैंने क्या किया:

  • INNER को निर्दिष्ट करने की कोई आवश्यकता नहीं – यह इस तथ्य से निहित है कि आप LEFT या दाईं ओर निर्दिष्ट नहीं करते हैं
  • अपनी प्राथमिक लुकअप तालिका न-प्रत्यय न करें
  • एन-प्रत्यण तालिका अलियंस जिसे आप स्पष्ट करने के लिए कई बार उपयोग करेंगे

* एक तरह से डीबीए प्राकृतिक कुंजियों को अद्यतन करने के लिए सिरदर्दों से बचने के लिए प्राथमिक कुंजी और विदेशी कुंजी बाधाओं को निर्दिष्ट नहीं करता है जो खराब डीबी डिजाइन के साथ मुद्दों को आगे बढ़ाते हैं। मैंने वास्तव में इसे अधिक बार नहीं देखा है

पहला तो अच्छा है जब तक फोन 1 या (अधिक होने की संभावना) फोन 2 शून्य हो सकता है। उस स्थिति में आप एक आंतरिक शामिल होने के बजाय वाम जोड़ का उपयोग करना चाहते हैं।

यह आमतौर पर एक बुरा संकेत है जब आपके पास दो फोन नंबर फ़ील्ड के साथ एक तालिका होती है आमतौर पर इसका अर्थ है कि आपका डेटाबेस डिज़ाइन दोषपूर्ण है।

पहली विधि उचित दृष्टिकोण है और वह आपकी क्या आवश्यकता होगी। हालांकि, आंतरिक जुड़ने के साथ, आप केवल तालिका 1 से पंक्तियों का चयन करेंगे, यदि दोनों फ़ोन नंबर Table2 में मौजूद हैं। आप एक LEFT JOIN करना चाह सकते हैं ताकि Table1 से सभी पंक्तियां चुने जा सकें। अगर फोन नंबर से मेल नहीं खाती है, तो कुछ SomeOtherField एस रिक्त हो जाएंगे। यदि आप यह सुनिश्चित करना चाहते हैं कि आपके पास कम से कम एक मेल खाने वाला फ़ोन नंबर है तो आप तब WHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL कर सकते हैं। फ़ोन नंबर WHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL फ़ोन नंबर WHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL

दूसरी विधि में समस्या हो सकती है: क्या होता है यदि Table2 में दोनों PhoneNumber1 और PhoneNumber2 ? कौन सी पंक्ति का चयन किया जाएगा? आपके डेटा, विदेशी कुंजियों, आदि के आधार पर यह समस्या हो सकती है या नहीं।

आप UNION का इस्तेमाल दो जोड़ों को जोड़ सकते हैं:

 SELECT Table1.PhoneNumber1 as PhoneNumber, Table2.SomeOtherField as OtherField FROM Table1 JOIN Table2 ON Table1.PhoneNumber1 = Table2.PhoneNumber UNION SELECT Table1.PhoneNumber2 as PhoneNumber, Table2.SomeOtherField as OtherField FROM Table1 JOIN Table2 ON Table1.PhoneNumber2 = Table2.PhoneNumber 

मेरी समस्या रिकॉर्ड को प्रदर्शित करने के लिए थी, भले ही कोई फ़ोन नंबर मौजूद न हो (पूर्ण पता पुस्तिका)। इसलिए मैंने एक बाएं जोड़ी का इस्तेमाल किया है जो बाएं से सभी रिकॉर्ड लेता है, भले ही सही पर मौजूद कोई भी मौजूद न हो। मेरे लिए यह माइक्रोसॉफ्ट एक्सेस एसक्यूएल में काम करता है (उन्हें कोष्ठक की आवश्यकता होती है!)

 SELECT t.PhoneNumber1, t.PhoneNumber2, t.PhoneNumber3 t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2, t3.someOtherFieldForPhone3 FROM ( ( Table1 AS t LEFT JOIN Table2 AS t3 ON t.PhoneNumber3 = t3.PhoneNumber ) LEFT JOIN Table2 AS t2 ON t.PhoneNumber2 = t2.PhoneNumber ) LEFT JOIN Table2 AS t1 ON t.PhoneNumber1 = t1.PhoneNumber;