سؤال

وكيف يمكنني الحصول على الاستعلام الذي يستخدم OR في جملة WHERE لتقسيم نفسها إلى قسمين الاستفسارات مع UNION خلال تجميع؟ إذا كنت يدويا إعادة كتابتها، الاستعلام باستخدام UNION هو 100X أسرع من استعلام واحد، لأنه يمكن استخدامها بفعالية مؤشرات مختلفة في كل استعلام للاتحاد. هل هناك أي طريقة يمكن أن تجعل من محسن استخدام هذا النهج؟

وعندي استفسار ويبدو أن شيئا من هذا القبيل:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

وأين columnlist، joincond2، joincond3، وconditions1 كلها تعبيرات أطول. كيكر هو أن واحدة فقط من الأوضاع في OR غير صحيح على الإطلاق.

واعتقدت في البداية أنا فقط يمكن إعادة كتابتها للقيام الاتحاد، ولكن بعد ذلك وإنني أكرر columnlist، joincond2، joincond3، وconditions1، وهو 20 أو نحو ذلك خطوط SQL التي قد تحتاج إلى الكثير من الصيانة في المستقبل. هناك تلميح ويمكنني أن العرض أو بعض أفضل وسيلة لكتابة جملة WHERE؟ يرجع الفضل في ذلك مسبقا.

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

المحلول

ويمكنك تجميع

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

وفي طريقة عرض، ومن ثم استخدام الاتحاد.

ولكن إذا كنت تستطيع الهجرة إلى SQL2005 / 8، يمكنك استخدام تعبير جدول المشترك.

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

نصائح أخرى

وحاول إضافة OPTION (إعادة ترجمة) إلى الاستعلام. لو كان في إجراء مخزن ثم إضافة WITH إعادة ترجمة لذلك أيضا. قد يكون من المرة الأولى التي تقوم بتشغيل SQL Server استعلام يأتي مع خطة وتخزين ولكن بعد ذلك للمرة الثانية خلال انها لا تزال تستخدم خطة الاستعلام القديمة (والآن الفقيرة).

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

تحرير: لقد قرأت أن استخدام WITH إعادة ترجمة في إجراء مخزن في SQL 2000 لا تعمل دائما بشكل صحيح. كان من المفترض أن إصلاح الأخطاء في SQL 2005. لم يسبق لي ان واجهت علة الرغم شخصيا، لذلك أنا لا أعرف ما هي الصفقة المحدد معها. محاولة إعطائها بالرغم من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top