2011-07-20 13 views
7

Szukam skutecznego sposobu wykluczania wierszy z mojego oświadczenie WHERE więcej niż jeden wiersz jest zwracana z identyczną wartością dla pewnej kolumny.Jak sprawdzić, czy w danej kolumnie znajduje się wiele wierszy o identycznej wartości?

W szczególności wybieram kilka kont, ale trzeba wykluczyć konta, na których znaleziono więcej niż jeden taki sam identyfikator SSN.

+2

Czy chcesz wykluczyć _all_ rekordy, które spełniają kryteria albo że chcesz wykluczyć tylko duplikaty, czyli pokaz rekord _one_ za SSN? – VolkerK

+0

Chcę wykluczyć ** wszystkie ** rekordy, które spełniają kryteria. – BueKoW

Odpowiedz

0

Dziękuję wszystkim za szczegółowe sugestie. Kiedy wszystko zostało powiedziane i zrobione, potrzebowałem użyć skorelowanej podkwerendy . Zasadniczo to właśnie musiałem zrobić:

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

Mam nadzieję, że to komuś pomaga.


Nigdy aktualizowane ten ... W moim ostatnim zdaniem, ja to osiągnąć poprzez lewej przyłączyć się do zwiększenia efektywności (skorelowana podzapytanie nie do przyjęcia, ponieważ miała dużo czasu, aby uruchomić, sprawdzenie każdy rekord z ponad 150 000 innych).

Oto, co trzeba zrobić, aby rozwiązać mój problem:

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

to zwróci wszystkie SSNs z dokładnie 1 rzędzie

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

to zwróci wszystkie SSNs z więcej niż 1 wiersz

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

Pełne zapytania byłoby tak (będzie działać na SQL Server 7 i więcej)

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

drugie zapytanie jest równe pierwsze;) – Jacob

+0

'mające count (*)> 1' w drugim zapytaniu – triclosan

+0

Yes..victim z CTRL + C, CTRL + V, a następnie nie zmieniając znaku =, tx – SQLMenace

6

dla SQL 2005 lub powyżej można spróbować to:

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

dla SQL 2000 i 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) 
Powiązane problemy