سؤال

كيف يمكنني التأكد من أن مجموعة النتائج الخاصة بي ستكون كذلك a أولا و b ثانية؟سيساعدني ذلك في حل مشكلة الطلب الصعبة.

فيما يلي مثال مبسط لما أفعله:

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1;
هل كانت مفيدة؟

المحلول

SELECT col
FROM 
   (
       SELECT a col, 0 ordinal FROM A LIMIT 1
       UNION ALL
       SELECT b, 1 FROM B LIMIT 1
   ) t
ORDER BY ordinal

نصائح أخرى

وأنا لا أعتقد أن مضمون النظام، على الأقل ليس في جميع DBMS.

وماذا فعلت في الماضي للسيطرة على الطلب في النقابات هي:

(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo
سوف

ونتيجة لديك مع مجموعة UNION القضاء على قيم مميزة.

وأنا لا يمكن العثور على أي دليل في الوثائق، ولكن من 10 سنوات خبرة أستطيع أن أقول أن UNION ALL لا الحفاظ على النظام، على الأقل في Oracle.

ولا تعتمد على هذا، ولكن، إذا كنت بناء محطة نووية أو شيء من هذا القبيل.

لا، يتم التحكم في ترتيب النتائج في استعلام SQL فقط بواسطة جملة ORDER BY.من الممكن أن ترى نتائج مرتبة بدون عبارة ORDER BY في بعض المواقف، ولكن ذلك يكون عن طريق الصدفة (على سبيل المثال:أحد الآثار الجانبية لخطة الاستعلام الحالية للمُحسِّن) وغير مضمون.

ما هي مشكلة الطلب الصعبة؟

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

وكان يمكن أن أفكر لا، لأن قاعدة البيانات على الأرجح بحاجة للقيام ORDER BY من أجل الاتحاد.

وUNION ALL قد تتصرف بشكل مختلف، ولكن YMMV.

والجواب القصير هو نعم، سوف تحصل على A ثم B.

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