2011-07-20 9 views
7

मैं अपने SELECT कथन WHERE से पंक्तियों को बाहर करने के लिए एक कुशल तरीका ढूंढ रहा हूं, एक पंक्ति से अधिक पंक्ति एक निश्चित कॉलम के समान मूल्य के साथ वापस आती है।मैं कैसे देख सकता हूं कि विशेष स्तंभ में समान मान वाले एकाधिक पंक्तियां हैं या नहीं?

विशेष रूप से, मैं खातों का एक समूह चुन रहा हूं, लेकिन उन खातों को बाहर करने की आवश्यकता है जहां एक से अधिक एसएसएन जुड़े हुए हैं।

+2

आप _all_ रिकॉर्ड कि कि मानदंडों को पूरा या आप केवल डुप्लिकेट, एसएसएन प्रति अर्थात शो _one_ रिकॉर्ड को बाहर निकालना चाहते हैं उन्हें हटा करना चाहते हैं? – VolkerK

+0

मैं मानदंडों को पूरा करने वाले ** सभी ** रिकॉर्ड बहिष्कृत करना चाहता हूं। – BueKoW

उत्तर

0

अपने विस्तृत सुझाव के लिए आप सभी को धन्यवाद। जब यह सब कहा और किया गया, तो मुझे सहसंबंधित सबक्वायरी का उपयोग करने की आवश्यकता थी। अनिवार्य रूप से, मुझे यही करना था:

SELECT acn, ssn, [date] FROM Account a 
WHERE NOT EXISTS (SELECT 1 FROM Account WHERE ssn = a.ssn AND [date] < a.[date]) 

उम्मीद है कि यह किसी की सहायता करेगा।


मैं इस ... अद्यतन कभी नहीं मेरा अंतिम प्रस्तुत करने में, मैं एक छोड़ दिया के माध्यम से यह लक्ष्य प्राप्त दक्षता बढ़ाने के लिए शामिल होने के (सहसंबद्ध सबक्वेरी के रूप में यह समय को चलाने के लिए एक बड़ी मात्रा में ले लिया है, जाँच स्वीकार्य नहीं था 150k से अधिक दूसरों के खिलाफ प्रत्येक रिकॉर्ड)।

यहाँ मेरी समस्या को हल करने के लिए किया जाना था:

SELECT acn, ssn 
    FROM Account a 
    LEFT JOIN (SELECT ssn, COUNT(1) AS counter FROM Account 
    GROUP BY ssn) AS counters 
    ON a.ssn = counters.ssn 
    WHERE counter IS NULL OR counter = 0 
12

इस (वास्तव में 1 पंक्ति

select ssn,count(*) 
from SomeTable 
group by ssn 
having count(*) = 1 

इस 1 से अधिक पंक्ति

select ssn,count(*) 
from SomeTable 
group by ssn 
having count(*) > 1 

आपका पूरा क्वेरी के साथ सभी SSNs वापस आ जाएगी इस तरह होगा के साथ सभी SSNs वापस आ जाएगी एसक्यूएल सर्वर पर काम करेंगे 7 और ऊपर)

select a.* from account a 
join(
select ssn 
from SomeTable 
group by ssn 
having count(*) = 1) s on a.ssn = s.ssn 
+0

दूसरी क्वेरी पहले के बराबर होती है;) – Jacob

+0

'दूसरी क्वेरी – triclosan

+0

हाँ में गिनती (*)> 1' हो रही है हाँ .. CTRL + C, CTRL + V का चित्रण और फिर = चिह्न नहीं बदल रहा है, टीएक्स – SQLMenace

6

एसक्यूएल 2005 के लिए या इसके बाद आप इस कोशिश कर सकते हैं:

WITH qry AS 
(
    SELECT a.*, 
     COUNT(*) OVER(PARTITION BY ssn) dup_count 
     FROM accounts a 
) 
SELECT * 
    FROM qry 
WHERE dup_count = 1 

एसक्यूएल 2000 और 7 के लिए:

SELECT a.* 
    FROM accounts a INNER JOIN 
    (
     SELECT ssn 
      FROM accounts b 
      GROUP BY ssn 
      HAVING COUNT(1) = 1 
    ) b ON a.ssn = b.ssn 
1
SELECT * 
FROM #Temp 
WHERE SSN NOT IN (SELECT ssn FROM #Temp GROUP BY ssn HAVING COUNT(ssn) > 1) 
संबंधित मुद्दे

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