2012-10-30 14 views
77

मुझे एक चुनिंदा कथन चलाने की ज़रूरत है जो सभी पंक्तियों को वापस लाती है जहां कॉलम का मान अलग नहीं है (उदा। ईमेल एड्रेस)।कॉलम वैल्यू अलग नहीं होने पर प्रत्येक पंक्ति का चयन कैसे करें

CustomerName  EmailAddress 
Aaron   [email protected] 
Christy   [email protected] 
Jason   [email protected] 
Eric    [email protected] 
John    [email protected] 

मैं क्वेरी की जरूरत है वापस जाने के लिए:

Aaron   [email protected] 
Christy   [email protected] 
John    [email protected] 

मैं कई पदों पढ़ा है और कोई लाभ नहीं हुआ विभिन्न प्रश्नों की कोशिश की है

उदाहरण के लिए, नीचे दी गई तालिका की तरह लग रहा है। जो प्रश्न मुझे विश्वास है वह काम करना चाहिए। क्या कोई वैकल्पिक विकल्प सुझा सकता है या मुझे बता सकता है कि मेरी क्वेरी में क्या गलत हो सकता है?

select EmailAddress, CustomerName from Customers 
group by EmailAddress, CustomerName 
having COUNT(distinct(EmailAddress)) > 1 

उत्तर

139

यह EXISTS तरीका की तुलना में काफी तेजी से होता है ..

ईमेल से पता लगाएं, ग्राहक से ग्राहक नाम जहां ईमेल एड्रेसमें नहीं है(ईमेल द्वारा ग्राहक समूह से चुनें ईमेल एड्रेस काउंटर (*)> 1)

9

कैसे

के बारे में
SELECT EmailAddress, CustomerName FROM Customers a 
WHERE Exists (SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress) 
4

बस मस्ती के लिए, यहाँ एक और तरीका है:

;with counts as (
    select CustomerName, EmailAddress, 
     count(*) over (partition by EmailAddress) as num 
    from Customers 
) 
select CustomerName, EmailAddress 
from counts 
where num > 1 
+0

सीटीई संस्करण के लिए +1 हमें कोड में खुद को दोहराना नहीं चाहिए, अगर हमें अब और नहीं करना है तो एसक्यूएल में खुद को दोहराएं। – yzorg

+0

मैं गिनती कॉलम (num से अधिक) के लिए _count का उपयोग करता हूं। जब मैं _default, _type, _sum, आदि जैसे SQL कीवर्ड के साथ कॉल करने के लिए कॉलम होता हूं तो मैं लगातार अंडरस्कोर का उपयोग करता हूं – yzorg

23

बात यह है कि आपकी क्वेरी के साथ सही नहीं है कि आप ईमेल और नाम से समूहीकरण कर रहे हैं, वह यह है कि ईमेल के प्रत्येक अद्वितीय सेट और नाम को एक साथ संयुक्त रूप से सेट किया गया है और इसलिए

aaron and [email protected] 
christy and [email protected] 
john and [email protected] 

को 3 अलग-अलग समूहों के रूप में माना जाता है बल्कि सभी एक समूह से संबंधित हैं।

नीचे दिए गए के रूप में क्वेरी का उपयोग करें:

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN 
    (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1) 
+5

मुझे यह भी पसंद है कि आपने स्वीकार किए गए उत्तर के विपरीत, मूल क्वेरी के साथ क्या गलत है, इसके बारे में एक स्पष्टीकरण भी शामिल किया है। –

6
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1 
+0

"डुप्लिकेट" के रूप में गिनती दिखाने के लिए मामूली वृद्धि: ग्राहक नाम का चयन करें, ग्राहक नाम से ग्राहक समूह से डुप्लिकेट के रूप में गिनती करें (1)> 1' – DynamicDan

-1

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

select emailaddress,customername from customers where emailaddress in 
(select emailaddress from customers group by emailaddress having count(*) > 1) 
0

ऐसी स्थिति में उप प्रश्नों का उपयोग करने की बजाय, जहां स्थिति में वृद्धि होगी, जहां रिकॉर्ड बड़े होते हैं।

मैं इस समस्या के बेहतर विकल्प के रूप में इनर जॉइन का उपयोग करने का सुझाव दूंगा।

ध्यान में रखते हुए एक ही मेज यह अभी भी बेहतर परिणाम मैं तुम्हें CustomerID या अपने तालिका के किसी भी अद्वितीय क्षेत्र का उपयोग करने के लिए सुझाव है कि परिणाम

SELECT EmailAddress, CustomerName FROM Customers as a 
Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress 

दे सकता है। CustomerName का डुप्लिकेशन संभव है।

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