2012-12-17 37 views
6

का चयन करके मैं एक तालिका में पंक्तियों का चयन करने की कोशिश कर रहा हूं जिसमें एक कॉलम में डुप्लिकेट है लेकिन अन्य कॉलम के आधार पर पंक्तियों को भी प्रतिबंधित करें। यह सही ढंग से काम नहीं कर रहा प्रतीत होता है।एसक्यूएल सर्वर एक कॉलम पर डुप्लिकेट ढूंढ रहा है लेकिन

select Id,Terms from QueryData 
    where Track = 'Y' and Active = 'Y' 
    group by Id,Terms 
    having count(Terms) > 1 

अगर मैं हटाने जहां यह ठीक काम करता है, लेकिन मैं केवल इन पंक्तियों के लिए सीमित करने की जरूरत है।

ID  Terms  Track Active 
100  paper  Y  Y 
200  paper  Y  Y 
100  juice  Y  Y 
400  orange N  N 
1000 apple  Y  N 

तो आदर्श रूप से क्वेरी को पहली 2 पंक्तियां वापस करनी चाहिए।

+0

मुझे लगता है कि कुछ नमूना डेटा आपकी समस्या का वर्णन करने में मदद मिलेगी ... मैं आप 'Id' द्वारा समूहीकरण रहे हैं नोटिस, यह कॉलम अद्वितीय नहीं है इस टेबल में? –

+0

इस तालिका पर कोई अनुक्रमणिका नहीं है और ऊपर नमूना प्रदान करेगा – vbNewbie

उत्तर

1

बिल्कुल जो भी आप कर रहे हैं उसे प्राप्त न करें। having में count(Terms) का उपयोग करें, हालांकि Terms आपके select खंड में है। इसका मतलब है कि प्रत्येक रिकॉर्ड के लिए count(Terms) होगा 1. शायद आपको select सूची से बाहर करना होगा। ईमानदारी से मैंने आपकी तालिका और क्वेरी को पुन: उत्पन्न किया और यह काम नहीं करता है।

शायद this आप जो खोज रहे हैं है (?):

select Id, count(Terms) from QueryData 
where Track = 'Y' and Active = 'Y' 
group by Id 
having count(Terms) > 1 
1

यह मानदंडों को पूरा सभी दोहराया मामले वापस आ जाएगी:

select Terms 
from QueryData 
where Track = 'Y' and Active = 'Y' 
group by Terms 
having count(*) > 1 

http://sqlfiddle.com/#!3/18a57/2

आप सभी चाहते हैं इन शर्तों के विवरण, आप इस परिणाम में शामिल हो सकते हैं।

;with dups as (
    select Terms 
    from QueryData 
    where Track = 'Y' and Active = 'Y' 
    group by Terms 
    having count(*) > 1 
) 
select 
    qd.ID, qd.Terms, qd.Track, qd.Active 
from 
    QueryData qd join 
    dups d on qd.terms = d.terms 

http://sqlfiddle.com/#!3/18a57/5

6
SELECT Id, Terms, Track, Active 
FROM QueryData 
WHERE Terms IN (
       SELECT Terms 
       FROM QueryData 
       WHERE Track = 'Y' and Active = 'Y' 
       GROUP BY Terms 
       HAVING COUNT(*) > 1 
       ) 

डेमो पर SQLFiddle