سؤال

يمكن/ينبغي علي استخدام مثل المعايير كجزء من INNER JOIN عند إنشاء إجراء مخزن/query ؟ أنا لست متأكدا من أنا أسأل الصواب, لذلك اسمحوا لي أن أشرح.

أنا إنشاء الإجراء الذي سوف تأخذ قائمة من الكلمات الرئيسية التي ترغب بالبحث عنها في عمود الذي يحتوي على النص.إذا كنت جالسا في وحدة التحكم ، أود أن تنفيذ ذلك على هذا النحو:

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

ولكن خدعة التقطت قليلا في حين أن تفعله "بشدة بكتابة" قائمة توزيع في إجراء مخزن يتم تحليل قائمة إلى متغير الجدول/الجدول المؤقت ، وتحويلها إلى النوع المناسب ومن ثم القيام صلة داخلية ضد هذا الجدول في النتيجة النهائية المحددة.هذا يعمل كبيرة عند إرسال قول من صحيح معرفات الإجراء.أنا الريح وجود النهائي الاستعلام الذي يبدو مثل هذا:

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

أريد أن استخدام هذه الحيلة مع قائمة من السلاسل.ولكن منذ أنا أبحث عن كلمة رئيسية معينة ، أنا ذاهب إلى استخدام مثل شرط.لذا أنا أفكر أنا سيكون لدي النهائي الاستعلام تبدو مثل هذا:

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

هل هذا ممكن/الموصى بها ؟

هل هناك طريقة أفضل للقيام بشيء مثل هذا ؟


السبب أنا أضع البدل على طرفي شرط لأن هناك "archfiend", "الوحش المحارب", "المباشرة الضرر" و "معركة الضرر" المصطلحات المستخدمة في البطاقة النصوص.

أنا على الحصول على انطباع بأن اعتمادا على أداء أي استعلام ط المحدد أو استخدام النص الكامل البحث عن الكلمات الرئيسية لإنجاز نفس المهمة ؟

البعض من وجود الخادم لا نص مؤشر على الحقول أريد أن نص البحث, هل هناك شيء آخر يجب أن أفعل ؟

هل كانت مفيدة؟

المحلول

الاستعلام الأول الخاص بك سوف تعمل ولكن سوف تتطلب الجدول الكامل المسح لأن أي مؤشر على أن عمود سيتم تجاهلها.سيكون لديك أيضا أن تفعل بعض ديناميكية SQL لتوليد كل ما تبذلونه من مثل الأحكام.

حاول البحث عن النص الكامل إذا كان لديك باستخدام SQL Server أو تحقق من واحدة من لوسين تطبيقات.جويل تحدث عن نجاحه مع أنه في الآونة الأخيرة.

نصائح أخرى

جرب هذا

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

هذه الممارسة ليست مثالية.استخدام مع الحذر.

يبدو أنك تبحث عن البحث عن نص كامل.لأنك تريد الاستعلام مجموعة من الكلمات الرئيسية ضد بطاقة الوصف العثور على أي يضرب ؟ الصحيح ؟

شخصيا, أنا قد فعلت ذلك من قبل ، وقد عملت بشكل جيد بالنسبة لي.فقط لا يمكن أن نرى ربما القضايا مع للتضخم العمود ، ولكن أعتقد سيكون لديك نفس المشكلة مع جملة where.

نصيحتي لك هي مجرد إلقاء نظرة على تنفيذ الخطط بين البلدين.أنا متأكد من أنه سوف تختلف من واحد الذي هو أفضل اعتمادا على الوضع ، تماما مثل كل شيء جيد مشاكل البرمجة.

@Dillie-O
كيف كبيرة هو هذه الطاولة ؟
ما هو نوع البيانات الوصف المجال ؟

إذا إما صغيرة النص الكامل البحث سوف تكون مبالغة.

@Dillie-O
ربما ليس الجواب كنت تبحث عنه ولكن أود أن الدعوة مخطط تغيير...

اقترح المخطط:

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)

هذا سوف تتيح لك استخدام المؤشر دون تنفيذ الترباس على حل يبقي بياناتك الذرية.

ذات صلة: أوصى قاعدة بيانات SQL تصميم العلامات أو علامات

خدعة التقطت قليلا حين تذهب أن تفعل "بشدة بكتابة" قائمة توزيع في إجراء مخزن يتم تحليل قائمة إلى متغير الجدول/مؤقت الجدول

أعتقد أن ما قد يكون إشارة إلى هنا هو وضع الكلمات أن تدرج في جدول ثم استخدام العلائقية شعبة العثور على المباريات (يمكن أيضا استخدام جدول آخر الكلمات لاستبعاد).على مثال عمل في SQL ترى عمليات البحث عن الكلمات الرئيسية جو Celko.

تحاول ذلك...

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

تعمل بالنسبة لي.:-)

سوف يكون الأداء تعتمد على الملقم الفعلي من الاستخدام ، على مخطط البيانات ، كمية البيانات.مع الإصدارات الحالية من MS SQL Server, هذا الاستعلام يجب أن تعمل على ما يرام (MS SQL Server 7.0 قد القضايا مع أن الجملة, ولكن كانت موجهة في SP2).

يجب تشغيل هذا الرمز من خلال التعريف?إذا كان الأداء هو سريع بما فيه الكفاية و البيانات المناسبة الفهارس في المكان ، يجب أن تكون كل مجموعة.

مثل '%شرير%' لن تستخدم التماس مثل 'شرير%' سوف.مجرد البحث البدل لا sargable

حاول هذا ؛

SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
                                CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top