كيفية تبسيط استعلام SQL هذا
-
03-07-2019 - |
سؤال
يحتوي الجدول - الاستعلام على عمودين (وظيفة ، depfunctionId)
أريد جميع القيم إما في وظيفة أو في depfunctionId
أنا أستخدم هذا:
select distinct depfunctionid from Query
union
select distinct functionid from Query
كيف تفعل ذلك بشكل أفضل؟
المحلول
أعتقد أن هذا أفضل ما ستحصل عليه.
نصائح أخرى
هذا جيد كما يحصل على ما أعتقد ...
تفقد الجمل المتميزة ، حيث أن اتحادك (مقابل Union All) سوف يهتم بإزالة التكرارات.
البديل - ولكن ربما أقل وضوحًا وربما مع خطة التنفيذ نفسها - هو القيام بانضمام كامل عبر العمودان.
SELECT
COALESCE(Query1.FunctionId, Query2.DepFunctionId) as FunctionId
FROM Query as Query1
FULL OUTER JOIN Query as Query2 ON
Query1.FunctionId = Query2.DepFunctionId
أنا متأكد تقريبًا من أنك تستطيع أن تفقد ما هو متميز. عندما تستخدم الاتحاد بدلاً من الاتحاد ، يتم إلقاء النتائج المكررة.
كل هذا يتوقف على مدى ثقل الاستعلام عن العرض المضمّن. المفتاح لتحسين perfomance هو التنفيذ مرة واحدة فقط ، ولكن هذا غير ممكن بالنظر إلى البيانات التي ترجعها.
إذا قمت بذلك مثل هذا:
select depfunctionid , functionid from Query
group by depfunctionid , functionid
من المحتمل جدًا أن تحصل على نتائج متكررة لـ DepunctionId أو FunctionId.
قد أكون مخطئًا ، لكن يبدو لي أنك تحاول استرداد شجرة من التبعيات. إذا كان هذا هو الحال ، فأنا شخصياً سأحاول استخدام نهج المسار الملموس.
إذا تم تخزين المسار الملمس في اسم جدول المرجع الذاتي ، فسأسترجع الشجرة باستخدام شيء مثل
select asrt2.function_id
from a_self_referencig_table asrt1,
a_self_referencig_table asrt2
where asrt1.function_name = 'blah function'
and asrt2.materialized_path like (asrt1.materialized_path || '%')
order by asrt2.materialized_path, asrt2.some_child_node_ordering_column
هذا من شأنه أن يسترجع الشجرة بأكملها بالترتيب الصحيح. ما تمتص هو الاضطرار إلى بناء المسار الملمس بناءً على الدالة _id و parent_function_id (أو في حالتك ، وظيفة و depfunctionId) ، ولكن يمكن أن يعتني به الزناد بسهولة.