我正在寻找一种有效的方法来从我的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)
对于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)
谢谢大家的详细建议。总而言之,我需要使用相关子查询。本质上,这就是我必须做的:
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)
| 归档时间: |
|
| 查看次数: |
5563 次 |
| 最近记录: |