如何查看特定列中是否存在多个具有相同值的行?

Bue*_*KoW 7 sql sql-server

我正在寻找一种有效的方法来从我的SELECT语句中排除行,WHERE返回多行,并为某列提供相同的值.

具体来说,我正在选择一堆帐户,但需要排除在多个帐户中找到相同SSN的帐户.

SQL*_*ace 12

这将返回所有正好1行的SSN

select ssn,count(*)
from SomeTable
group by ssn
having count(*) = 1
Run Code Online (Sandbox Code Playgroud)

这将返回超过1行的所有SSN

select ssn,count(*)
from SomeTable
group by ssn
having count(*) > 1
Run Code Online (Sandbox Code Playgroud)

您的完整查询将是这样的(将在SQL Server 7及更高版本上运行)

select a.* from account a
join(
select ssn
from SomeTable
group by ssn
having count(*) = 1) s on a.ssn = s.ssn
Run Code Online (Sandbox Code Playgroud)


Cha*_*ndu 6

对于SQL 2005或更高版本,您可以尝试:

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

对于SQL 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
Run Code Online (Sandbox Code Playgroud)


Bue*_*KoW 0

谢谢大家的详细建议。总而言之,我需要使用相关子查询。本质上,这就是我必须做的:

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

希望这对某人有帮助。


我从未更新过这一点... 在我的最终提交中,我通过左连接实现了这一点以提高效率(相关子查询是不可接受的,因为它需要花费大量时间来运行,并与超过 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 
Run Code Online (Sandbox Code Playgroud)