الجمع بين UNION ALL وORDER BY في Firebird
-
21-08-2019 - |
سؤال
هذه هي محاولتي الأولى للإجابة على سؤالي، حيث قد يواجه شخص ما هذا الأمر وقد يكون مفيدًا.باستخدام Firebird، أريد دمج نتائج استعلامين باستخدام UNION ALL، ثم فرز المخرجات الناتجة في عمود معين.شيء مثل:
(select C1, C2, C3 from T1)
union all
(select C1, C2, C3 from T2)
order by C3
جاءت الأقواس من بناء جملة صالح لقواعد بيانات أخرى، وهي ضرورية للتأكد من أن الوسائط الخاصة بـ UNION ALL (عملية تم تعريفها للعمل على الجداول - أي.ان غير مرتبة مجموعة السجلات) لا تحاول أن يتم طلبها بشكل فردي.ومع ذلك، لم أتمكن من تشغيل بناء الجملة هذا في Firebird - كيف يمكن القيام بذلك؟
المحلول
SELECT C1, C2, C3
FROM (
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
)
order by C3
نصائح أخرى
وأسماء الحقول لتكون على قدم المساواة. لهذا السبب لا يمكنك استخدام اسم الحقل في النظام من قبل.
تستطيع استخدام الفهرس المجال بدلا من ذلك. كما في:
(select C1, C2, C3 from T1)
union all
(select C7, C8, C9 from T2)
order by 3
وماذا عن:
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
order by 2
وعلى الأقل في إصدارات أحدث فايربيرد يعمل إذا كنت من أجل كتبها "الرقم" بدلا من استخدام اسم مستعار.
في فايربيرد 1.5 يعمل هذا بالنسبة لي
create view V1 (C1, C2, C3) as
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
ثم
select C1, C2, C3 from V1 order by C3
ونفذ UNION ALL في طريقة عرض (بدون جملة ORDER BY)، ثم حدد من طريقة العرض باستخدام ORDER BY.
متحرك order by
في ذيل الاستعلام لديه لا تأثير لإخراج datagrid.
select * from (
select first 1
C1
from T1
order by id desc
)
union all
select * from (
select first 1
C1
from T2
order by id desc
)