الانضمام الخارجي أو الاستعلام الديناميكي، وهو أفضل طريقة للذهاب؟

StackOverflow https://stackoverflow.com/questions/1291839

سؤال

لدي الجداول التالية (قمت بتبسيط البيانات الموجودة في الجداول).

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 الجدول بسرعة.

كن حذرا مع الانضمام الديكارتية. يمكنهم الخروج من اليد بسرعة كبيرة مع الجداول الحجم المعقول! استمتع!

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