2011-09-28 12 views
25

स्वीकार शामिल हों के लिए मेरे पास निम्न क्वेरी:कैसे एसक्यूएल अंदरूनी अशक्त परिणाम

SELECT TOP 25 CLIENT_ID_MD5, COUNT(CLIENT_ID_MD5) TOTAL 
FROM dbo.amazonlogs 
GROUP BY CLIENT_ID_MD5 
ORDER BY COUNT(*) DESC; 

कौन देता है:

283fe255cbc25c804eb0c05f84ee5d52 864458 
879100cf8aa8b993a8c53f0137a3a176 126122 
06c181de7f35ee039fec84579e82883d 88719 
69ffb6c6fd5f52de0d5535ce56286671 68863 
703441aa63c0ac1f39fe9e4a4cc8239a 47434 
3fd023e7b2047e78c6742e2fc5b66fce 45350 
a8b72ca65ba2440e8e4028a832ec2160 39524 
... 

मैं इसी ग्राहक का नाम (फर्म) को पुनः प्राप्त करने के लिए लौट आए MD5 का उपयोग कर चाहते हैं

879100cf8aa8b993a8c53f0137a3a176 126122 Burger King 

तो मैं इस क्वेरी बनाया: इस क्वेरी से है, तो एक पंक्ति कैसा लग सकता है

879100cf8aa8b993a8c53f0137a3a176 126122 Burger King 
06c181de7f35ee039fec84579e82883d 88719  McDonalds 
703441aa63c0ac1f39fe9e4a4cc8239a 47434  Wendy's 
3fd023e7b2047e78c6742e2fc5b66fce 45350  Tim Horton's 

कौन सा, काम करता है को छोड़कर मैं c.FIRM के लिए एक खाली मान देने के लिए अगर वहाँ एक दिया MD5 के लिए कोई इसी फर्म है की जरूरत है:

SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL, c.FIRM 
FROM dbo.amazonlogs a 
    INNER JOIN dbo.customers c 
    ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
GROUP BY a.CLIENT_ID_MD5, c.FIRM 
ORDER BY COUNT(*) DESC; 

कुछ इस तरह देता है। उदाहरण के लिए:

879100cf8aa8b993a8c53f0137a3a176 126122 Burger King 
06c181de7f35ee039fec84579e82883d 88719  McDonalds 
69ffb6c6fd5f52de0d5535ce56286671 68863 
703441aa63c0ac1f39fe9e4a4cc8239a 47434  Wendy's 
3fd023e7b2047e78c6742e2fc5b66fce 45350  Tim Horton's 

यदि कोई संबंधित सी.एफआईआरएम नहीं है तो भी मुझे पंक्ति को वापस करने के लिए क्वेरी को कैसे संशोधित करना चाहिए?

+10

यह पिच काला है। अंधेर राक्षस द्वारा आपको खाए जाने की संभावनाएं हैं। – SQLMason

उत्तर

81

साथ LEFT JOIN

+6

बाएं जॉइन पंक्तियों को वापस लौटाता है जब भी आप शामिल होने वाली अन्य तालिका में कोई मिलान नहीं करते हैं। अंदरूनी जॉइन नहीं होगा, अगर यह अन्य तालिका – evilone

+0

में कोई मिलान है तो यह केवल पंक्तियों को लौटाता है तो * यह * अंतर है ... – Jackson

2

एक भीतरी शामिल नहीं NULLs में शामिल होने INNER JOIN बदलें; आप एक बाएं बाहरी शामिल होना चाहते हैं।

1
SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL, IsNull(c.FIRM, 'Unknown') as Firm 
FROM dbo.amazonlogs a 
    LEFT JOIN dbo.customers c ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
GROUP BY a.CLIENT_ID_MD5, c.FIRM ORDER BY COUNT(*) DESC; 

इससे आपको "अज्ञात" का मूल्य मिलेगा जब ग्राहक तालिका में रिकॉर्ड मौजूद नहीं होंगे। आप स्पष्ट रूप से उस हिस्से को छोड़ सकते हैं और यदि आप इसके बजाय वास्तविक नल रखना चाहते हैं तो बस सी। एफआईआरएम वापस कर सकते हैं।

2
इसके बजाय एक आंतरिक जोड़ कर की

, आप एक वाम बाहरी में शामिल होने के लिए क्या करना चाहिए:

SELECT 
    a.CLIENT_ID_MD5, 
    COUNT(a.CLIENT_ID_MD5) TOTAL, 
    ISNULL(c.FIRM,'') 
FROM 
    dbo.amazonlogs a LEFT OUTER JOIN 
    dbo.customers c ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
GROUP BY 
    a.CLIENT_ID_MD5, 
    c.FIRM 
ORDER BY COUNT(0) DESC 

http://www.w3schools.com/sql/sql_join.asp

+0

आपके पास अपनी क्वेरी में एक टाइपो है - बाएं ऑरर जॉइन – evilone

+0

चीयर्स बुराई .. –

9

उपयोग LEFT JOIN के बजाय INNER JOIN

1

बदले अपने भीतर एक बाहरी शामिल हों के लिए शामिल हों ..

SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL, c.FIRM 
FROM dbo.amazonlogs a 
LEFT OUTER JOIN dbo.customers c 
    ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
GROUP BY a.CLIENT_ID_MD5, c.FIRM 
ORDER BY COUNT(*) DESC; 
1
WITH amazonlogs_Tallies 
    AS 
    (
     SELECT a.CLIENT_ID_MD5, COUNT(a.CLIENT_ID_MD5) TOTAL 
     FROM dbo.amazonlogs a 
     GROUP 
      BY a.CLIENT_ID_MD5 
    ), 
    amazonlogs_Tallies_Firms 
    AS 
    (
     SELECT a.CLIENT_ID_MD5, a.TOTAL, c.FIRM 
     FROM amazonlogs_Tallies a 
      INNER JOIN dbo.customers c 
       ON c.CLIENT_ID_MD5 = a.CLIENT_ID_MD5 
    ) 
SELECT CLIENT_ID_MD5, TOTAL, FIRM 
    FROM amazonlogs_Tallies_Firms 
UNION 
SELECT CLIENT_ID_MD5, TOTAL, '{{NOT_KNOWN}}' 
    FROM amazonlogs_Tallies 
EXCEPT 
SELECT CLIENT_ID_MD5, TOTAL, '{{NOT_KNOWN}}' 
    FROM amazonlogs_Tallies_Firms; 
संबंधित मुद्दे