2008-08-21 10 views
10

के हिस्से में एक LIKE क्लॉज का उपयोग करें, क्या मैं एक संग्रहीत प्रक्रिया/क्वेरी बनाते समय INNER जॉइन के हिस्से के रूप में एक LIKE मानदंड का उपयोग कर सकता/सकती हूं? मुझे यकीन नहीं है कि मैं सही चीज़ पूछ रहा हूं, इसलिए मुझे समझाएं।एक INNER JOIN

मैं एक ऐसी प्रक्रिया तैयार कर रहा हूं जो टेक्स्ट वाले एक कॉलम में खोजे जाने वाले कीवर्ड की एक सूची ले जायेगा। अगर मैं कंसोल पर बैठा हुआ था, मैं इसे इस तरह के रूप अमल चाहते हैं:

SELECT Id, Name, Description 
    FROM dbo.Card 
WHERE Description LIKE '%warrior%' 
     OR 
     Description LIKE '%fiend%' 
     OR 
     Description LIKE '%damage%' 

लेकिन एक चाल मैं थोड़ी देर उठाया में एक संग्रहीत प्रक्रिया सूची पार्स करने में है "दृढ़ता से टाइप किया" सूची पार्स करने के लिए जाना एक तालिका परिवर्तनीय/अस्थायी तालिका में, इसे उचित प्रकार में परिवर्तित करना और फिर मेरे अंतिम परिणाम सेट में उस तालिका के विरुद्ध एक INNER जॉइन करना। प्रक्रिया में पूर्णांक आईडी की एक सूची कहने पर यह बहुत अच्छा काम करता है। मैं एक अंतिम क्वेरी को हवा में डालता हूं जो इस तरह दिखता है:

SELECT Id, Name, Description 
    FROM dbo.Card 
     INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId 

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

SELECT Id, Name, Description 
    FROM dbo.Card 
     INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%' 

क्या यह संभव/अनुशंसित है?

क्या ऐसा कुछ करने का बेहतर तरीका है?


कारण मैं खंड के दोनों सिरों पर वाइल्डकार्ड डाल रहा हूं क्योंकि वहाँ "शैतान", "जानवर योद्धा", "प्रत्यक्ष-नुकसान" और "लड़ाई-क्षति" शब्दों में इस्तेमाल किया जाता है कार्ड ग्रंथों।

मुझे इंप्रेशन मिल रहा है कि प्रदर्शन के आधार पर, मैं या तो निर्दिष्ट क्वेरी का उपयोग कर सकता हूं या एक ही कार्य को पूरा करने के लिए एक पूर्ण-पाठ कीवर्ड खोज का उपयोग कर सकता हूं?

सर्वर को फ़ील्ड पर टेक्स्ट इंडेक्स करने के अलावा, मैं टेक्स्ट खोजना चाहता हूं, क्या मुझे कुछ और करने की ज़रूरत है?

उत्तर

4

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

यदि आप SQL सर्वर का उपयोग करते हैं या Lucene कार्यान्वयन में से किसी एक को चेक आउट करते हैं तो पूर्ण टेक्स्ट खोज आज़माएं। जोएल ने हाल ही में अपनी सफलता के बारे में बात की।

1

ऐसा लगता है कि आप पूर्ण-पाठ खोज की तलाश में हैं। क्योंकि आप कार्ड विवरण के खिलाफ कीवर्ड के एक सेट से पूछना चाहते हैं और कोई हिट ढूंढना चाहते हैं? सही बात?

1

व्यक्तिगत रूप से, मैंने इसे पहले किया है, और यह मेरे लिए अच्छा काम कर चुका है। एकमात्र मुद्दे जो मैं देख सकता था वह संभवतः एक अनइंडेक्ड कॉलम के साथ समस्या है, लेकिन मुझे लगता है कि आपको एक खंड के साथ एक ही समस्या होगी।

मेरी सलाह है कि आप दोनों के बीच निष्पादन योजनाओं को देखें। मुझे यकीन है कि यह अलग-अलग प्रोग्रामिंग समस्याओं की तरह ही स्थिति के आधार पर बेहतर होगा।

0

प्रदर्शन आपके द्वारा उपयोग किए जाने वाले वास्तविक सर्वर पर और डेटा की स्कीमा और डेटा की मात्रा पर निर्भर करेगा। एमएस एसक्यूएल सर्वर के मौजूदा संस्करणों के साथ, वह क्वेरी ठीक चलनी चाहिए (एमएस एसक्यूएल सर्वर 7.0 में उस वाक्यविन्यास के साथ समस्याएं थीं, लेकिन it was addressed in SP2)।

क्या आपने एक कोडर के माध्यम से यह कोड चलाया है? यदि प्रदर्शन पर्याप्त तेज़ है और डेटा में उपयुक्त इंडेक्स हैं, तो आपको पूरा सेट होना चाहिए।

0

LIKE '% fiend%' कभी भी एक खोज का उपयोग नहीं करेगा, जैसे 'fiend%' होगा। बस एक वाइल्डकार्ड खोज sargable

1

@ डिली-ओ
यह तालिका कितनी बड़ी है?
विवरण फ़ील्ड का डेटा प्रकार क्या है?

यदि कोई छोटा टेक्स्ट खोज छोटा हो तो अधिक हो जाएगा।

@ Dillie-ओ
शायद नहीं जवाब तुम कहाँ की तलाश में है, लेकिन मैं एक स्कीमा परिवर्तन की वकालत करेंगे ...

प्रस्तावित स्कीमा:

create table name(
    nameID identity/int 
    ,name varchar(50)) 

create table description(
    descID identity/int 
    ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values 

create table nameDescJunc(
    nameID int 
    ,descID int) 

यह आप का उपयोग बिना सूचकांक के कराएंगे समाधान पर बोल्ट लागू करने के लिए, और आपके डेटा परमाणु रखता है।

संबंधित: Recommended SQL database design for tags or tagging

1

एक चाल मैं एक छोटे से उठाया में जाना है, जबकि "दृढ़ता से टाइप किया" सूची पार्स करने के लिए एक संग्रहीत प्रक्रिया एक मेज चर में सूची पार्स करने में है/अस्थायी तालिका

मुझे लगता है कि तुम यहाँ की ओर इशारा करते हो सकता है एक तालिका में शामिल करने के लिए कीवर्ड डालना तो relational division का उपयोग मैचों (शब्द को बाहर करने के लिए भी एक और तालिका इस्तेमाल कर सकते हैं) मिल रहा है। एसक्यूएल में एक काम उदाहरण के लिए Keyword Searches by Joe Celko देखें।

0

इसे आजमाएं;

SELECT Id, Name, Description 
FROM dbo.Card 
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
           CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%' 
3

इस

select * from Table_1 a 
    left join Table_2 b on b.type LIKE '%' + a.type + '%' 

इस अभ्यास आदर्श नहीं है की कोशिश करो। सावधानी से प्रयोग करें।

+2

मुझे लगता है कि 'यह होना चाहिए concat ('%', a.type, '%')' http।: //stackoverflow.com/a/23276513/443900 – Lee

0

मेरे लिए यह कोशिश ...

select * from table11 a inner join table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'. 

इसका काम करता है :-)

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