SQL Server الاتحاد - ما هو الترتيب الافتراضي من خلال السلوك

StackOverflow https://stackoverflow.com/questions/421049

سؤال

إذا كان لدي بضع الاتحاد البيانات كما المفتعلة على سبيل المثال:

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

ما هو الافتراضي order by السلوك ؟

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

شيء آخر هو أنه في هذه الحالة xxx هو الرأي.عرض ينضم 3 جداول مختلفة معا لإرجاع نتائج أريد.

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

المحلول

لا يوجد الترتيب الافتراضي.

دون النظام شرط النظام عاد هو غير معروف.وهذا يعني SQL Server يمكن أن تجلب لهم مرة أخرى في أي أمر أنه يحب.

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

نصائح أخرى

في ما يخص إضافة جملة ORDER BY:

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

على سبيل المثال:

SELECT 1, * FROM xxx WHERE z = 'abc'
UNION ALL
SELECT 2, * FROM xxx WHERE z = 'def'
UNION ALL
SELECT 3, * FROM xxx WHERE z = 'ghi'
ORDER BY 1

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

فقط وجدت الجواب الفعلي.

لأن الاتحاد يزيل التكرارات يفعل متميزة نوعا ما.ويتم ذلك من قبل الاتحاد البيانات متسلسلة (راجع خطة التنفيذ).

لوقف نوع هل الاتحاد هذا أيضا إزالة التكرارات.

إذا كنت الرعاية ما تأمر يتم إرجاع السجلات ، يجب استخدام النظام من قبل.

إذا كنت ترك ذلك ، قد تظهر نظمت (استنادا إلى المؤشرات التي اختارها خطة الاستعلام) ، ولكن النتائج التي تراها اليوم قد لا تكون النتائج التي كنت تتوقعها ، حتى يمكن تغيير عند نفس الاستعلام يتم تشغيل غدا.

تحرير:بعض أمثلة محددة:(جميع الأمثلة MS SQL server)

  • ديف بينال بلوق يصف كيف مشابهة جدا استفسارات يمكن أن تظهر مختلفة ظاهر الأمر لأن مختلف المؤشرات المستخدمة:

    SELECT ContactID FROM Person.Contact
    SELECT *         FROM Person.Contact
    
  • كونر كانينغهام يبين كيف يبدو الأمر يمكن أن تتغير عندما الطاولة يحصل على أكبر (إذا كان للمحسن الاستعلام تقرر استخدام خطة تنفيذ متوازي).

  • هوغو Kornelis يثبت أن الظاهر أمر لا دائما على أساس المفتاح الأساسي. هنا متابعة آخر مع الشرح.

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

ومع ذلك هناك خوارزميات الضمني متميزة مثل أوراكل تجزئة طريقة في 10g+, والتي لا يأمر سيتم تطبيقها.

كما DJ يقول دائما استخدام النظام من قبل

فإنه من الشائع جدا أن تأتي عبر سيئة مكتوبة البرمجية التي يفترض بيانات الجدول يتم إرجاعها في إدراج النظام, و 95% من الوقت المبرمج يحصل بعيدا مع ذلك و هو لا يعي أن هذه مشكلة كما في العديد من قواعد البيانات المشتركة (MSSQL, Oracle, MySQL).هو بالطبع مغالطة كاملة و يجب أن دائما تصحيح عندما تأتي عبر ، دائما ، من دون استثناء ، استخدام جملة Order By نفسك.

من خبرتي العملية يمكنك تغيير النظام باستخدام "الاتحاد" ضد "الاتحاد كافة"...أنا.هـ إذا كان الاستعلام الخاص بك هو مثل

Select Count(*) from Table A
UNION 
Select Count(*) from Table B

result is
10
26

يمكنك الوجه من النظام عن طريق استبدال "الاتحاد" مع "النقابة للجميع"...ثم ستكون النتيجة

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