SQL:在同一个表中获取重复项

时间:2018-05-17 13:47:25

标签: sql ms-access

我有下表:

name  email              number  type
1     abc@example.com     10     A
1     abc@example.com     10     B
2     def@def.com         20     B
3     ggg@ggg.com         30     B
1     abc@example.com     10     A
4     hhh@hhh.com         60     A

我想要以下内容:

结果

name  email              number  type
1     abc@example.com     10     A
1     abc@example.com     10     B
1     abc@example.com     10     A

基本上,我想找到三列(名称,电子邮件,号码)相同的第一行,无论其类型如何,都可以看到它们。

我如何在SQL中实现这一点?我不希望每次组合一次的结果,我想多次看到表中的每一行。

我想过做一个小组,但是小组只给我一个独特的组合和每一行。我尝试了桌子本身的连接但不知何故它太臃肿了。

有什么想法吗?

编辑:我也希望显示类型列,因此分组不起作用,因此,它不是重复的。

3 个答案:

答案 0 :(得分:1)

您可以对该案例使用exists:

select t.*
from table t 
where exists (select 1 
              from table 
              where name = t.name and email = t.email and 
                    number = t.number and type <> t.type);

如果你的 DBMS 支持

,你也可以使用窗口功能
select * 
from (select *, count(*) over (partition by name, email, number) Counter 
      from table
     ) t
where counter > 1;

答案 1 :(得分:1)

您可以使用窗口功能:

select t.*
from (select t.*, count(*) over (partition by name, email, number) as cnt
      from t
     ) t
where cnt > 1;

如果您只想要具有不同类型的组合(这可能是您真正的问题),我建议exists

select t.*
from t
where exists (select 1 
              from t t2
              where t2.name = t.name and t2.email = t.email and t2.number = t.number and t2.type <> t.type
             );

对于性能,您希望此版本的(name, email, number, type)上有索引。

答案 2 :(得分:1)

核心SQL-99兼容解决方案。

有一个返回名称,电子邮件,具有重复项的数字组合的子查询。加入该结果:

select t1.*
from tablename t1
join (select name, email, number
      from tablename
      group by name, email, number
      having count(*) > 1) t2
on  t1.name = t2.name
and t1.email = t2.email
and t1.number = t2.number