1.题目描述
2.题目核心内容解释:
给表中数据查重,然后投影部分
3.解答方法
- 对两表进行直接操作
select distinct p1.Email
from Person p1, Person p2
where
p1.Email=p2.Email and p1.id<p2.id;
代码很简单,需要注意一个小细节,p1.id<p2id,如果此处只是简单地用不等来判断,会造成重复。(此题用了distinct,所以也无所谓)
缺点:distinct费时,两表笛卡尔积也费时,最终耗时342ms。
- 临时表加分组
select Email
from
(
select Email, count(Email) as c
from person
group by Email
) as t
where t.c>1;
知识点也就是临时表与group by两个,思路就是通过临时表来统计出每种email的计数,然后对计数进行判断。
缺点:效率依旧很低,耗时314ms
- group by加上having
select Email
from person group by Email having count(Email)>1;
通过group by进行分组,代替了distinct的存在,再通过having中的聚合函数对分组后进行筛选,效率提高很多。耗时只有145ms
结语
除了以上的方法以外,我还发现了一个小问题,如果在sql语句中不同的位置加入回车会对整个语句的运行效率产生很大的影响,这是与sql服务器对于sql语句解析相关的。