2011-11-16 12 views
69

तो मैं नीचे इस एसक्यूएल कोड की तरह कुछ करना चाहता हूं:मैं एकाधिक कॉलम में डुप्लिकेट कैसे ढूंढूं?

select s.id, s.name,s.city 
from stuff s 
group by s.name having count(where city and name are identical) > 1 

निम्नलिखित का उत्पादन करने के लिए, (लेकिन केवल नाम या केवल शहर मिलान को अनदेखा करें, यह दोनों कॉलम पर होना चाहिए):

id  name city 
904834 jim London 
904835 jim London 
90145 Fred Paris 
90132 Fred Paris 
90133 Fred Paris 

उत्तर

96

जोड़े name और city के लिए दोहराए id:

select s.id, t.* 
from [stuff] s 
join (
    select name, city, count(*) as qty 
    from [stuff] 
    group by name, city 
    having count(*) > 1 
) t on s.name = t.name and s.city = t.city 
+0

नोट समूह में होना चाहिए कि यदि या तो '' '' '' name''' या city''' शामिल '' 'null''', तो वे बाहरी क्वेरी में रिपोर्ट करने में विफल रहेगा, लेकिन आंतरिक क्वेरी में मिलान किया जाएगा। –

+0

यदि मानों में संभवतः '' 'null''' हो सकता है (तब तक जब तक कि मुझे कुछ याद न हो) आपको इसे' '' क्रोस जॉइन '(पूर्ण कार्टेशियन उत्पाद) में बदलना होगा और फिर '' ' जहां '' 'खंड है: '' 'WHERE ((s.name = t.name) या (s.name शून्य है और t.name शून्य है) और ((s.city = t.city) या (s.city शून्य है और t.city शून्य है)) '' ' –

0

आपको सामान में शामिल होना और नाम और शहर से मेल खाना है। फिर गिनती से समूह।

select 
    s.id, s.name, s.city 
from stuff s join stuff p ON (
    s.name = p.city OR s.city = p.name 
) 
group by s.name having count(s.name) > 1 
+0

एसक्यूएल सर्वर में विफल: सभी गैर-कुल कॉलम द्वारा – gbn

7

ऐसा कुछ ऐसा चाल करेगा। प्रदर्शन के बारे में नहीं जानते, इसलिए कुछ परीक्षण करें।

select 
    id, name, city 
from 
    [stuff] s 
where 
1 < (select count(*) from [stuff] i where i.city = s.city and i.name = s.name) 
14
SELECT name, city, count(*) as qty 
FROM stuff 
GROUP BY name, city HAVING count(*)> 1 
0

एक से अधिक स्तंभ के लिए डुप्लिकेट रिकॉर्ड का पता लगाएं, सबसे अच्छा तरीका है स्वयं तालिका के साथ शामिल होने के

select * 
from [stuff] s 
join (
    select name, city 
    from [stuff] 
    group by name, city 
    having count(*) > 1 
) t on s.name = t.name and s.city = t.city 
0

एक को देखते हुए 70 कॉलम के साथ स्टेजिंग टेबल और केवल 4 डुप्लिकेट का प्रतिनिधित्व करते हैं, यह कोड अपमानजनक कॉलम लौटाएगा:

SELECT 
    COUNT(*) 
    ,LTRIM(RTRIM(S.TransactionDate)) 
    ,LTRIM(RTRIM(S.TransactionTime)) 
    ,LTRIM(RTRIM(S.TransactionTicketNumber)) 
    ,LTRIM(RTRIM(GrossCost)) 
FROM Staging.dbo.Stage S 
GROUP BY 
    LTRIM(RTRIM(S.TransactionDate)) 
    ,LTRIM(RTRIM(S.TransactionTime)) 
    ,LTRIM(RTRIM(S.TransactionTicketNumber)) 
    ,LTRIM(RTRIM(GrossCost)) 
HAVING COUNT(*) > 1 

संबंधित मुद्दे