2009-09-06 14 views
36

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

उदाहरण के लिए: यदि ए में कॉलम 'foo' है। फिर बी में कॉलम या तो है: 'fooblah', 'somethingfooblah', या सिर्फ 'foo' अगर जुड़ना मैच होगा। मुझे पता है कि वाइल्डकार्ड को मानक जैसे स्टेटमेंट में कैसे उपयोग किया जाए, लेकिन इसमें शामिल होने पर उलझन में है। इसका कोई मतलब भी है क्या? धन्यवाद।

उत्तर

16

MySQL में आप की कोशिश कर सकते:

SELECT * FROM A INNER JOIN B ON B.MYCOL LIKE CONCAT('%', A.MYCOL, '%');

बेशक यह एक बड़े पैमाने पर अक्षम क्वेरी किया जाएगा, क्योंकि यह एक पूर्ण तालिका स्कैन करना होगा।

अद्यतन: यहाँ एक सबूत


create table A (MYCOL varchar(255)); 
create table B (MYCOL varchar(255)); 
insert into A (MYCOL) values ('foo'), ('bar'), ('baz'); 
insert into B (MYCOL) values ('fooblah'), ('somethingfooblah'), ('foo'); 
insert into B (MYCOL) values ('barblah'), ('somethingbarblah'), ('bar'); 
SELECT * FROM A INNER JOIN B ON B.MYCOL LIKE CONCAT('%', A.MYCOL, '%'); 
+-------+------------------+ 
| MYCOL | MYCOL   | 
+-------+------------------+ 
| foo | fooblah   | 
| foo | somethingfooblah | 
| foo | foo    | 
| bar | barblah   | 
| bar | somethingbarblah | 
| bar | bar    | 
+-------+------------------+ 
6 rows in set (0.38 sec) 
+1

धन्यवाद..मैं एक ही कार्यक्षमता कैसे प्राप्त करूंगा लेकिन इसे और अधिक कुशल बनाऊंगा? –

+0

यह है कि आप इसे कैसे करेंगे। यदि आपको इसे अधिक कुशल होने की आवश्यकता है, तो आप तालिका बी –

+0

पर MYCOL फ़ील्ड को इंडेक्स कर सकते हैं यदि आप MyISAM तालिका प्रकार का उपयोग कर रहे हैं, तो आप एक पूर्ण टेक्स्ट इंडेक्स आज़मा सकते हैं और देख सकते हैं कि इससे मदद मिलती है या नहीं। आम तौर पर, पूर्ण पाठ खोज MySQL की ताकत नहीं है। यदि पूर्ण पाठ खोज आपके आवेदन का मुख्य हिस्सा है, तो Apache Lucene - http://lucene.apache.org/java/docs/ – Asaph

63

INSTR का उपयोग करना है:

SELECT * 
    FROM TABLE a 
    JOIN TABLE b ON INSTR(b.column, a.column) > 0 

तरह का उपयोग करना: की तरह उपयोग करना

SELECT * 
    FROM TABLE a 
    JOIN TABLE b ON b.column LIKE '%'+ a.column +'%' 

, concat साथ:

SELECT * 
    FROM TABLE a 
    JOIN TABLE b ON b.column LIKE CONCAT('%', a.column ,'%') 

मन है कि सभी विकल्प में, तो आप शायद स्तंभ मान ड्राइव करने के लिए सुनिश्चित करने के लिए आप मामले संवेदनशीलता के लिए चिंता का विषय के बिना मैचों हो रही है की तुलना करने से पहले अपरकेस चाहता हूँ:

SELECT * 
    FROM (SELECT UPPER(a.column) 'ua' 
     TABLE a) a 
    JOIN (SELECT UPPER(b.column) 'ub' 
     TABLE b) b ON INSTR(b.ub, a.ua) > 0 

सबसे कुशल पर अंततः निर्भर करेगा EXPLAIN plan आउटपुट।

JOIN खंड WHERE खंड लिखने के समान हैं। JOIN सिंटैक्स को एएनएसआई जॉइन के रूप में भी जाना जाता है क्योंकि उन्हें मानकीकृत किया गया था। गैर एएनएसआई देखने मिलती है जैसे:

SELECT * 
    FROM TABLE a, 
     TABLE b 
WHERE INSTR(b.column, a.column) > 0 

मैं एक उदाहरण के गैर एएनएसआई बायाँ शामिल हों के साथ परेशान करने के लिए नहीं जा रहा हूँ। एएनएसआई जॉइन सिंटैक्स का लाभ यह है कि यह WHERE खंड में वास्तव में क्या हो रहा है, उससे तालिकाओं में शामिल होने से अलग हो जाता है।

+0

LIKE और INSTR के लिए सबसे अच्छी गति क्या है (उदाहरण के लिए डोमेन नाम)? – Meloman

5

यह कुछ आप अक्सर करने की आवश्यकता होगी है ... तो आप टेबल ए और बी

के बीच के रिश्ते denormalize लिए उदाहरण के लिए, तालिका बी को डालने पर, आप शून्य लिख सकता है चाहते हो सकता है या आंशिक मैपिंग के आधार पर एक जूनियन टेबल मैपिंग बी से ए में अधिक प्रविष्टियां। इसी तरह, किसी भी तालिका में परिवर्तन इस एसोसिएशन को अपडेट कर सकता है।

यह सब इस बात पर निर्भर करता है कि कितनी बार टेबल ए और बी संशोधित होते हैं। यदि वे काफी स्थिर हैं, तो INSERT पर एक हिट लेना कम दर्दनाक है फिर चयन पर बार-बार हिट।

+2

यह एक अच्छा समाधान है, लेकिन यह denormalization को कॉल करने के लिए सटीक नहीं है। –

+2

पर्याप्त मेला। फिर इसे एक जंक्शन तालिका कहते हैं –

1

एक जॉइन में सशर्त मानदंडों का उपयोग करना निश्चित रूप से कहां से अलग है। तालिकाओं के बीच कार्डिनिटी जॉइन और कहां क्लॉज के बीच मतभेद पैदा कर सकती है।

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

मैं आम तौर पर पूर्व उत्तरों में से एक में दी गई शैली का उपयोग करता हूं।

tbl_A as ta 
    LEFT OUTER JOIN tbl_B AS tb 
      ON ta.[Desc] LIKE '%' + tb.[Desc] + '%' 

इस तरह मैं शामिल प्रकार को नियंत्रित कर सकता हूं।

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