从一个字段返回包含重复数据的所有行的SQL查询

4

我有一个包含卡号和姓名的表格。其中有些人有多张卡片,也就是说他们的名字在表格中出现了多次。如何选择所有名字出现次数超过一次的行?

5个回答

7
以下可能是您正在寻找的解决方案。
Select * from CardTable where cardid in ( select cardid from CardTable group by cardid having count(cardid) > 1)

子查询仅在您想要返回名称以外的列时才是必需的。 - OMG Ponies
-1:您的查询无法正常工作,将不会返回任何行。如果按cardid分组,则count(cardid) = 1适用于所有行。 - Unreason
1
如果你能解释一下为什么认为你的查询会返回任何数据行(或者我的理解哪里有误),我将非常高兴地更正我的分数。你认为cardid是一个名称还是标识符?问题说明有卡号和姓名。 - Unreason

2

使用:

  SELECT t.name
    FROM TABLE t
GROUP BY t.name
  HAVING COUNT(*) > 1

1

以下代码应该可以正常工作:

SELECT        * 
FROM cards    c1 
INNER JOIN    cards c2 on c1.name = c2.name 
WHERE         c2.id <> c1.id

如果任何一张卡牌的数量大于2,那么你将会得到多次结果。 - Unreason

0
select count(*) as n, [name]
from table1
group by [name]
having n > 1

2
SQL Server不允许您在GROUP BY或HAVING子句中引用列别名 - 至少在SQL Server 2005上会出现“无效列名'n'”的错误。 - OMG Ponies

0
如果您需要整行数据,这里有一个适用于 SQL 7 及以上版本的解决方案。
SELECT t1.* FROM(
 SELECT t.name
    FROM YourTable t
GROUP BY t.name
  HAVING COUNT(*) > 1) t2
  JOIN YourTable t1 on t2.name = t1.name

这个查询的性能是否和在 MS SQL 上使用 SELECT * FROM YourTable WHERE t.name IN (子查询) 一样好? - Unreason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接