الانضمام الخارجي أو الاستعلام الديناميكي، وهو أفضل طريقة للذهاب؟
-
18-09-2019 - |
سؤال
لدي الجداول التالية (قمت بتبسيط البيانات الموجودة في الجداول).
RateTable
- rate_table_id [int]
- rate_table_name [nvarchar(50)]
RateTableUsed
- rate_used_id [int]
- rate_table_id [int] (key to RateTable.rate_table_id)
- customer_id [int]
RateTableExtra
- rate_table_extra_id [int]
- rate_ extra_id [int] (key to RateExtra.rate_table_id)
- rate_used_id [int] (key to RateTableUsed.rate_used_id)
RateExtra
- rate_ extra_id [int]
- rate_extra_name [nvarchar(50)]
select rate_table_name, rate_table_extra_id, rate_extra_name from RateTableUsed rtu
innerjoin RateTable rt on rtu.rate_table_id = rt.rate_table_id
innerjoin RateTableExtra rte on rte.rate_table_id = rt.rate_table_id
innerjoing RateExtr re on rte.rate_extra_id = re.rate_extra_id
يحتوي RateStraSA على 3 قيم فقط مع المفتاح 1 و 2 و 3 وأسماء رسوم إضافية للبنزين ورسوم الإدارة و GST.
هذا يعمل بشكل جيد لأنه الغرض الحالي. يتم عرض قائمة القيم مع سجلات مطابقة وتساءل RateSextra فقط للحصول على rate_extra_name.
لذلك قد يكون لدي النتائج التالية:
- Readetable1، 1، البنزين
- Readetable1، 2، ManagementFee
- Readetable2، 3، البنزين
- Readetable4، 4، GST
- Readetable6، 5، البنزين
لقد طلب مني تعديل هذا بحيث يتضمن كل سجل إرجاع الآن سجلات لكل قيمة في جدول HARDEXTRA. إذا لم تكن هناك سجلات مطابقة، فعندئذ يجب أن تعود البيانات من جدول RatetableExtra ك Null Null. لذلك يجب أن تعود البيانات الخاصة بي
- Readetable1، 1، البنزين
- Readetable1، 2، ManagementFee
- Readetable1، NULL، GST
- Readetable2، 3، البنزين
- Readetable2، NULL، ManagementFee
- Readetable2، NULL، GST
- Readetable4، البترول فارغة
- Readetable4، NULL، ManagementFee
- Readetable4، 4، GST
- Readetable6، 5، البنزين
- Readetable6، NULL، ManagementFee
- Readetable6، NULL، GST
لقد حاولت الانضمام الخارجي ولكن لا يبدو أنهم يعملون لأنني أفترض لأن بيانات RateExtra مرتبطة ب RatetableExtra والتي سترجع NULL. أنا أفكر الآن في إنشاء استعلام ديناميكي سيحصل على مجموعة النتائج الأصلية الخاصة بي، تكرره عند التحقق من ذلك للحصول على Rate_Extra_ID، وإذا لم يكن موجودا بالفعل في النتائج، فقم بإلغاء صف جديد للنتائج مع بيانات فارغة حيث أحتاج إليها. أفترض أن هذا سيعمل لكنني شعرت بأنه سيكون قاتلا على الأداء.
هل هناك أي طريقة أفضل للقيام بذلك؟ آمل أن يساعد شخص ما، فمن الأفضل حقا.
المحلول
جرب هذا:
select
rate_table_name,
rate_table_extra_id,
rate_extra
from
RateTableUsed rtu
inner join RateTable rt on
rtu.rate_table_id = rt.rate_table_id
cross join RateExtra re
left outer join RateTableExtra rte on
rte.rate_table_id = rt.rate_table_id
and rte.rate_extra_id = re.rate_extra_id
order by rt.rate_table_name, re.rate_extra_id
ما تحصل عليه مع هذا الاستعلام هو، أساسا، الانضمام الديكارتيون بين RateTable
و RateExtra
, ، مع left join
للعثور على قيم RateTableExtra
التي تطابق تلك الأزواج. أساسا، هذا الاستعلام يجلب كله ممكن مجموعات من RateTable
و RateExtra
, ، وإظهار ما الذي لديك في حياتك RateTableExtra
الجدول بسرعة.
كن حذرا مع الانضمام الديكارتية. يمكنهم الخروج من اليد بسرعة كبيرة مع الجداول الحجم المعقول! استمتع!