2013-01-16 15 views
32

मान लीजिए मैं निम्नलिखित 2 टेबल था:एसक्यूएल सर्वर लापता में शामिल होने के शून्य मान

 Result: 
Col1:  Col2:  Col3:  Col4: 
a   b   c   d 
e   <null> f   g 
h   i   j   k 
l   <null> m   n 
o   <null> p   q 
:

 Table1:        Table2: 
Col1:  Col2:  Col3:    Col1:  Col2:  Col4: 
a   b   c     a   b   d 
e   <null> f     e   <null>  g 
h   i   j     h   i   k 
l   <null> m     l   <null>  n 
o   <null> p     o   <null>  q 

अब, मैं की तरह लग रहे करने के लिए Col1 और Col2 पर इन तालिकाओं में शामिल होने और पूरे सेट वापस लाना चाहते हैं

तो, मैं की तरह एक एसक्यूएल की कोशिश की:

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 
FROM Table1 INNER JOIN Table2 
ON Table1.Col1 = Table2.Col1 
AND Table1.Col2 = Table2.Col2 

लेकिन यह वें मिलान नहीं किया गया है ई Col2 में NULL मूल्यों, तो मैं अंत:

 Result: 
Col1:  Col2:  Col3:  Col4: 
a   b   c   d 
h   i   j   k 

मैं परिणाम मैं देख रहा हूँ कैसे प्राप्त कर सकते हैं ??

धन्यवाद!

उत्तर

45

के बारे में जुड़ जाता है आप स्पष्ट हो सकता है:

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 
FROM Table1 INNER JOIN 
    Table2 
     ON (Table1.Col1 = Table2.Col1 or Table1.Col1 is NULL and Table2.Col1 is NULL) AND 
     (Table1.Col2 = Table2.Col2 or Table1.Col2 is NULL and Table2.Col2 is NULL) 

व्यवहार में, मैं और अधिक में शामिल होने की हालत में coalesce() का उपयोग होने की संभावना होगी:

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 
FROM Table1 INNER JOIN 
    Table2 
    ON (coalesce(Table1.Col1, '') = coalesce(Table2.Col1, '')) AND 
     (coalesce(Table1.Col2, '') = coalesce(Table2.Col2, '')) 

कहाँ '' एक मूल्य में नहीं होगा टेबल में से कोई भी।

सावधानी बरतने का एक शब्द। अधिकांश डेटाबेस में, इनमें से किसी भी संरचना का उपयोग इंडेक्स के उपयोग को रोकता है।

+1

हाय @ गॉर्डन-linoff तरह मैप कर सकते हैं, आपका जवाब इस मामले में सबसे अनमोल था। बहुत धन्यवाद –

10

ISNULL समारोह उपयोग करके देखें:

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 
FROM Table1 
INNER JOIN Table2 
    ON Table1.Col1 = Table2.Col1 
    AND ISNULL(Table1.Col2, 'ZZZZ') = ISNULL(Table2.Col2,'ZZZZ') 

कहाँ 'ZZZZ' कुछ मनमाना मूल्य तालिका में कभी नहीं है।

+5

यह जादू मूल्यों को प्रस्तुत करता है जिन्हें मैं पूरी तरह से आवश्यक –

+0

तक टालना चाहता हूं, यह अच्छी तरह से काम करेगा, लेकिन मानता है कि '0' किसी अन्य पंक्ति में कहीं और नहीं उपयोग किया जाता है। – PinnyM

+0

हाँ, मैं @ गॉर्डन का जवाब पसंद करता हूं, बस एक विकल्प पेश करता हूं। और मैं शायद एक अलग मूल्य का उपयोग करूंगा जो मुझे पता था कि 'ZZZZ' या कुछ जैसे वापसी मूल्यों में प्रदर्शित नहीं किया जा सकता था :-) – sgeddes

5

गंदा और त्वरित हैक:

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 
FROM Table1 INNER JOIN Table2 ON Table1.Col1 = Table2.Col1 
AND ((Table1.Col2 = Table2.Col2) OR (Table1.Col2 IS NULL AND Table2.Col2 IS NULL)) 
+0

धन्यवाद, @ जैप - वास्तव में जो मैं ढूंढ रहा था ... गॉर्डन ने आपको मार दिया , लेकिन इसका जवाब देने के लिए धन्यवाद! –

16

उपयोग वाम बाहरी भीतरी के बजाय जुड़ें NULLS साथ पंक्तियों को शामिल करने में शामिल हों।

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 
FROM Table1 LEFT OUTER JOIN 
    Table2 ON Table1.Col1 = Table2.Col1 
    AND Table1.Col2 = Table2.Col2 

अधिक जानकारी के लिए यहाँ देखें: http://technet.microsoft.com/en-us/library/ms190409(v=sql.105).aspx

+0

मेरे लिए काम करता है। आसान और साफ – Kuvalya

+0

यह मूल प्रश्न का उत्तर नहीं देता है। यदि कोई मिलान नहीं मिला तो आपके समाधान में तालिका 2 के लिए शून्य पंक्तियां शामिल होंगी। ओपी के प्रश्न – AaA

+0

में दोनों टेबलों में दूसरी पंक्ति को देखें .. धन्यवाद! –

-1

आप सिर्फ इतना है कि

select * from tableA a 
join tableB b on isnull(a.colID,'') = isnull(b.colId,'') 
संबंधित मुद्दे