我有下表:
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中实现这一点?我不希望每次组合一次的结果,我想多次看到表中的每一行。
我想过做一个小组,但是小组只给我一个独特的组合和每一行。我尝试了桌子本身的连接但不知何故它太臃肿了。
有什么想法吗?
编辑:我也希望显示类型列,因此分组不起作用,因此,它不是重复的。
答案 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