简体   繁体   中英

How do I see if there are multiple rows with an identical value in particular column?

I'm looking for an efficient way to exclude rows from my SELECT statement WHERE more than one row is returned with an identical value for a certain column.

Specifically, I am selecting a bunch of accounts, but need to exclude accounts where more than one is found with the same SSN associated.

this will return all SSNs with exactly 1 row

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

this will return all SSNs with more than 1 row

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

Your full query would be like this (will work on SQL Server 7 and up)

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

For SQL 2005 or above you can try this:

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

For SQL 2000 and 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
SELECT * 
FROM #Temp
WHERE SSN NOT IN (SELECT ssn FROM #Temp GROUP BY ssn HAVING COUNT(ssn) > 1)

Thank you all for your detailed suggestions. When it was all said and done, I needed to use a correlated subquery . Essentially, this is what I had to do:

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

Hope this helps someone.


I never updated this... In my final submission, I achieved this through a left join to increase efficiency (the correlated subquery was not acceptable as it took a significant amount of time to run, checking each record against over 150K others).

Here is what had to be done to solve my 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 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM