हर पंक्ति का चयन कैसे करें जहां कॉलम मूल्य विकृत नहीं है


154

मुझे एक चयन कथन चलाने की ज़रूरत है जो सभी पंक्तियों को लौटाता है जहाँ एक स्तंभ का मूल्य अलग नहीं है (उदाहरण के लिए EmailAddress)।

उदाहरण के लिए, यदि तालिका नीचे दी गई है:

CustomerName     EmailAddress
Aaron            aaron@gmail.com
Christy          aaron@gmail.com
Jason            jason@gmail.com
Eric             eric@gmail.com
John             aaron@gmail.com

मुझे लौटने के लिए क्वेरी की आवश्यकता है:

Aaron            aaron@gmail.com
Christy          aaron@gmail.com
John             aaron@gmail.com

मैंने कई पोस्ट पढ़ी हैं और बिना किसी लाभ के विभिन्न प्रश्नों को आजमाया है। मुझे लगता है कि काम करना चाहिए क्वेरी नीचे है। क्या कोई विकल्प सुझा सकता है या मुझे बता सकता है कि मेरी क्वेरी में क्या गलत हो सकता है?

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

जवाबों:


263

यह EXISTSरास्ते से काफी तेज है :

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

1
अरे, मुझे पता है कि यह उत्तर 7 साल पुराना है, लेकिन अगर आप अभी भी आस-पास हैं तो क्या आप यह बताएंगे कि यह कैसे काम करता है? मेरी समस्या का भी हल किया!
लू

4
HAVINGएक दूसरे के बजाय यहां उपयोग SELECT...WHEREकरने से यह एक एकल क्वेरी होने का कारण बनता है, दूसरे विकल्प के बजाय जो उस SELECT...WHEREकॉल को कई बार निष्पादित करता है । यहाँ और देखें: stackoverflow.com/q/9253244/550975
सर्ज सगन

मुझे बदनाम [EmailAddress] must appear in the GROUP BY clause or be used in an aggregate functionत्रुटि मिलती है । केवल फिक्स - संपादन है sql_mode?
वलोडिमिर बोबीर

[EmailAddress]GROUP BYक्लॉज में आईएस
सर्ज सगन

51

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

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com

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

कृपया नीचे दिए गए अनुसार क्वेरी का उपयोग करें:

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

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


11
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1

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

8

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

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

1
+1 CTE वर्जन के लिए हमें अपने आप को कोड में दोहराना नहीं चाहिए, क्यों हम SQL में खुद को दोहराते हैं अगर हमें अब और नहीं करना है।
yzorg

1
मैं गणना कॉलम (संख्या के ऊपर) के लिए _count का उपयोग करता हूं। मैं लगातार अंडरस्कोर का उपयोग करता हूं जब कॉलम SQL कीवर्ड जैसे _default, _type, _sum, इत्यादि से
टकराते हैं

4

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

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

उसी तालिका को देखते हुए यह परिणाम दे सकता है

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

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


-2

अच्छी तरह से गैर अलग पंक्तियों को खोजने के लिए थोड़ा बदलाव है ..

SELECT EmailAddress, CustomerName FROM Customers WHERE EmailAddress NOT IN
(SELECT EmailAddress FROM Customers GROUP BY EmailAddress HAVING COUNT(*) > 1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.