it-swarm.asia

لماذا لا يعمل هذا الانضمام الخارجي الكامل؟

لقد استخدمت وصلات خارجية كاملة من قبل للحصول على النتائج المرجوة ، ولكن ربما لا أفهم المفهوم بالكامل لأنني لست قادرًا على تحقيق ما يجب أن يكون صلة بسيطة.

لدي جدولان (أسميهما t1 و t2) مع حقلين لكل منهما:

ر 1

Policy_Number Premium
101             15
102              7
103             10
108             25
111              3

ر 2

Policy_Number   Loss
101              5
103              9
107              20

ما أحاول القيام به هو الحصول على مجموع Premium و Sum of Losses من كلا الجدولين وكذلك Policy_Number. الرمز الذي أستخدمه هو:

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber

سيعيد الرمز أعلاه إجماليات المجموع الصحيحة ولكنه سيجمع كل السجلات في حالة عدم وجود تطابق number_nit policy ضمن "NULL" policy_number.

أود أن تظهر نتيجتي على هذا النحو

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5

إلخ.....

لا أريد نتيجة تُظهر رقم سياسة خالية NULL كما هو موضح أدناه (حيث لا يوجد شيء مثل رقم سياسة خالية NULL. هذا هو مجرد الإجمالي عندما لا يتطابق رقم السياسة من كلا الجدولين):

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL

إذا قمت بتحديد وتجميع بواسطة t2.policy_number بدلاً من t1.policy_number ، فإنني أحصل على شيء مثل أدناه كسجل.

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20

مرة أخرى ، لا أمانع في رؤية NULL تحت Prem_Sum أو تحت Loss_sum لكني لا أريد NULL تحت Policy_Number. أود أن تكون نتائجي مثل شيء

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5

إلخ .....

اعتقدت أن الانضمام الخارجي الكامل سيحقق ذلك ولكن أعتقد أنني أفتقد شيئًا. كنت أفكر ربما يمكنني تحديد وتجميع كل من t1.policy_number و t2.policy_number كاستعلام فرعي ثم ربما أقوم بإجراء حالة في الاستعلام الخارجي أو شيء من هذا القبيل ؟؟؟ لا أعتقد أن هذا يجب أن يكون معقدًا.

أي أفكار أو نصائح؟

10
Juan Velez

يجب إجراء isnull على كلا أرقام السياسة حتى تتمكن من التجميع بشكل صحيح.

نظرًا لأنه صلة خارجية ، هناك احتمال أن يكون جانب واحد من الصلة فارغًا مع استمرار البيانات.

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, isnull(t1.policynumber, t2.policynumber)
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by isnull(t1.policynumber, t2.policynumber)
8
Derek Kromm

ستنشئ الصلة الخارجية الكاملة بنية السجل التي تحتاجها ، لكنها لن تضع السياسة رقم 107 في الجدول 1 من أجلك.

أعتقد أن ما تحتاجه هو شيء على غرار

select coalesce(t1.policy_number, t2.policy_number) as PolicyNumber, 
sum(t1.premium) as PremSum, sum(t2.loss) as LossSum
from t1 full outer join t2 on t1.policy_number = t2.policy_number
group by coalesce(t1.policy_number, t2.policy_number)
4
Hellion

لتقديم المزيد من المعلومات حول سبب عدم عمل استعلامك المحدد. رمز البداية كان:

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber 
from t1 full outer join t2 on t1.policynumber = t2.policynumber 
group by t1.policynumber 

للوهلة الأولى ، يبدو أنه يجب أن يعمل. ومع ذلك ، لاحظ أن العمود الثالث المحدد هو t1.policynumber. هذا هو أيضًا عمود التجميع الوحيد. بسبب هذا SQL Server يرى فقط القيم في t1 ، وترك أي قيم ليست في t1 فارغة (لأن ، تذكر ، هذا صلة خارجية كاملة). سيزودك رمز isnull (t1.policynumber، t2.policynumber) بكافة القيم غير الفارغة في t1 ، ثم استخدم القيم في t2.

2
DForck42