2013-07-22 116 views
1

我正在使用SQL Server 2008 RD。SQL:在一组列上查找具有匹配值的记录

我有下面的表格说myTable由很多列组成。 AccIDAccName是我感兴趣的列,而非它们是主键。所以我想获得所有的记录至少有一个重复(可能有超过2行同意AccIDAccName)。

AccID  AccName 
1 333  SomeName1 
2 333  SomeName1 
3 444  SomeName2 
4 444  SomeName2 
5 444  SomeName2 

我该怎么用SQL做这件事?

回答

2

规定与条件聚合函数试试这个方法:

select m1.AccID, m1.AccName 
from myTable m1 
join (select AccID,AccName 
     from myTable 
     group by AccID,AccName 
     having count(1) = 2 
     ) m2 on m1.AccID = m2.AccID 
      and m1.AccName = m2.AccName 
+1

非常不错的把戏... –

+0

我已经把upvoted了:) –

+0

我用你的回答替代'有(1)= 2'有'有计数(*)> 1',我向上投票@ mhasan谢谢 –

3

使用GROUP BY子句和COUNT通过

HAVING COUNT(*) > 1 
1
select t.* 
from myTable t 
inner join 
(
    select AccID, AccName 
    from myTable 
    group by AccID, AccName 
    having count(1) > 1 
) agg on t.AccID = agg.AccID and t.AccName = agg.AccName 
2

如果你想把所有的记录(的不只是名字重复值),我会建议使用count()窗口函数:

select t.* 
from (select t.*, count(*) over (partition by AccID, AccName) as cnt 
     from mytable t 
    ) t 
where cnt > 1; 
+0

学到了新的东西......谢谢 –

+0

1+,因为它很美:) –

+2

太复杂了。一个简单的小组,并且会做。 –

相关问题