यह पूर्ण बाहरी कार्य क्यों नहीं काम कर रहा है?


10

मैंने अपना वांछित परिणाम प्राप्त करने से पहले पूर्ण बाहरी जॉइन का उपयोग किया है, लेकिन शायद मैं पूरी तरह से अवधारणा को नहीं समझ पा रहा हूं क्योंकि मैं एक साधारण जॉइन नहीं कर पा रहा हूं।

मेरे पास 2 टेबल्स हैं, (जो वेल्ल कॉल टी 1 और टी 2 है) प्रत्येक 2 फ़ील्ड्स के साथ:

t1

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

t2

Policy_Number   Loss
101              5
103              9
107              20

मैं जो करने की कोशिश कर रहा हूं, वह दोनों तालिकाओं से प्रीमियम और समसामयिकी का योग है और पॉलिसी_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

उपरोक्त कोड सही राशि योग लौटाएगा, लेकिन यह उन सभी रिकॉर्डों को समूहित करेगा जहां "NULL" पॉलिसी_number के तहत पॉलिसी_नंबर मैच नहीं है।

मैं अपने परिणाम को इस तरह देखना चाहूंगा

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

आदि.....

मैं ऐसा परिणाम नहीं चाहता जो नीचे दिखाए गए अनुसार NULL policy_number दिखाता हो (क्योंकि NULL नीति_number जैसी कोई चीज़ नहीं है। यह तब के लिए कुल है जब दोनों तालिका से policy_number मेल नहीं खाता):

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL

अगर मैं t1.policy_number के बजाय t2.policy_number सेलेक्ट करता हूं और समूह करता हूं, तो मुझे एक रिकॉर्ड के रूप में नीचे कुछ मिलता है।

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20

फिर से, मुझे प्रेम_सुम के तहत या लॉस_सुम के तहत NULL को देखने में कोई आपत्ति नहीं है, लेकिन मैं पॉलिसी के तहत NULL नहीं चाहता हूं। मैं चाहूंगा कि मेरे परिणाम कुछ इस तरह हों

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

ect .....

मुझे लगा कि पूरा बाहरी जुड़ाव इसे पूरा करेगा लेकिन मुझे लगता है कि मुझे कुछ याद आ रहा है। मैं सोच रहा था कि शायद मैं t1.policy_number और t2.policy_number दोनों को चुनकर एक उप क्वेरी के रूप में समूह बना सकता हूं और फिर शायद बाहरी क्वेरी या किसी चीज़ में CASE करूं ??? मुझे नहीं लगता कि यह इस जटिल होना चाहिए।

कोई विचार या सलाह?

जवाबों:


8

आपको दोनों पोलिनेन्स पर एक इस्नाल करना चाहिए ताकि आप ठीक से समूह बना सकें।

चूंकि यह एक बाहरी-जुड़ाव है, इसलिए डेटा होते हुए भी NULL के एक तरफ होने की संभावना है।

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)

... जिसका अर्थ है कि नल को SQL द्वारा मानों की तरह व्यवहार किया जाता है यही कारण है कि आपको ISNULL () की आवश्यकता है। यही कारण है कि एसक्यूएल इतना खराब है। फिर भी मैं इसे अभी भी दैनिक उपयोग करता हूं।
पॉल-सेबेस्टियन मैनोल

4

पूर्ण बाहरी जुड़ाव उस रिकॉर्ड संरचना को बनाएगा जिसकी आपको आवश्यकता है, लेकिन यह आपके लिए नीति संख्या 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)

2

आपकी विशिष्ट क्वेरी के काम नहीं करने के कारण थोड़ी और जानकारी प्रदान करने के लिए। आपका शुरुआती कोड था:

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 ​​सर्वर के कारण केवल t1 में मान दिखता है, किसी भी मान को t1 में एक अशक्त के रूप में नहीं छोड़ता है (क्योंकि, याद रखें, यह पूर्ण बाहरी जुड़ाव है)। Isnull (t1.policynumber, t2.policynumber) कोड आपको t1 में सभी गैर-शून्य मान प्रदान करेगा, फिर t2 में मानों का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.