كيف يمكنني طلب الإدخالات في UNION بدون ORDER BY؟
-
03-07-2019 - |
سؤال
كيف يمكنني التأكد من أن مجموعة النتائج الخاصة بي ستكون كذلك 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.