0

我有一个数据库表,其中每一行都有一个first_namelast_name列,如下所示:

 id   first_name   last_name
|----|------------|-----------|
| 1  | ted        | jones     |
| 2  | mike       | johnson   |
| 3  | ted        | jones     |
| 4  | jan        | smith     |
| 5  | anna       | white     |
| 6  | jan        | smith     |
|-----------------------------|

我想找到所有重复的记录,即名字和姓氏是相同的。鉴于上面的数据,我想要一个结果集,如:

 id   first_name   last_name
|----|------------|-----------|
| 1  | ted        | jones     |
| 3  | ted        | jones     |
| 4  | jan        | smith     |
| 6  | jan        | smith     |
|----|------------|-----------|

(更具体地说,我想计算这种重复记录,例如,在这种情况下,2[或者4,要么就足够了]。)

有没有办法通过 SQL 做到这一点?

4

4 回答 4

3

查找重复项的常用方法是:

select first_name, last_name, count(*) as DupeCount 
from table
group by first_name, last_name
having count(*) > 1

这会给你所有的名字。有多种获取关联 ID 的方法,但一些更好的方法是特定于服务器的。

于 2013-07-25T23:58:16.817 回答
2

您加入表本身和不匹配的 id (PK)

假设你的表名是Names

SELECT COUNT(1) CNT, N1.first_name,N1.last_name
  FROM NAMES N1 INNER JOIN 
       NAMES N2 ON
       N1.first_name = N2.first_name
       AND N1.last_name = N2.last_name
       AND N1.ID <> N2.ID
 GROUP BY N1.first_name,N1.last_name
于 2013-07-25T23:57:28.250 回答
0
SELECT COUNT(*) as "Number of duplicates" FROM `tableName` GROUP BY first_name, last_name;

要获得总和,一种简单的方法是再次用 SUM() 将其包装起来,或者使用 HAVING ... 构造,具体取决于您想要实现的目标。

于 2013-07-25T23:57:58.050 回答
0

我的解决方案是

 select t.id, t.first_name,t.last_name
 from TableTest t
 where first_name in
(
  select t1.first_name
  from TableTest t1
  group by t1.first_name,t1.last_name
  having count(*) > 1
) 
and last_name in
(
  select t1.last_name
  from TableTest t1
  group by t1.first_name,t1.last_name
  having count(*) > 1
)
于 2013-07-27T21:27:13.123 回答