SQL去重的四种方法
去重是指:查询的时间, 不显示重复,并不是删除表中的重复项数据表:
https://i-blog.csdnimg.cn/direct/65b38bc51ce0417c8ea0a4ae9485cd7c.png
方法1:distinct去重
作用:只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系,只有全部条件相同才会去重
弊端:当查询的字段比较多时,distinct会作用多个字段,导致去重条件增多
代码:
select distinct UserResult from Table1
https://i-blog.csdnimg.cn/direct/d82cbd5d1c8c4a15ae03c3f16ac9ee3b.png
方法2:group by去重
作用:将重复的行进行分组,相同的数据只显示第一行
弊端:使用group by后,全部查询字段都需要使用聚合函数,比较繁琐
留意点:这样去除之后的数据是保存的第一条重复的数据,如果想保存最后一条数据,将min()改成max(),此为,如果存在null的情况,如果获取最后一条数据中有空字段时,如果想拿空值,数据库会自动拿上一个值添补空值
代码:
selectmin(UserName)UserName,min(UserSex)UserSex,min(UserSubject)UserSubject,min(UserResult)UserResult from Table1
group by UserResult
https://i-blog.csdnimg.cn/direct/29561ce232b542808d2cd6cc1fa6ccdf.png
方法3:使用函数:row_number() over (parttion by 分组列 order by 排序列)
作用:先根据重复列进行分组,分组后再进行排序,不同的组序号为1,相同的组序号为2,排除为2的就到达了去重结果
缺点:需要8.0以上的数据库才气支持写法
代码:
select *from
(
--查询出重复行
select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1
)A
where A.num=1
https://i-blog.csdnimg.cn/direct/d7e3429757284d99b682f576a3ff2414.png
方法4:方法3的进阶
代码:一张表a,开始时间是b,用户姓名c
select a.* from a join(select c, max(b) as max b from a group by c ) b
on a.c = b.c and
a.b = b.max b
原理:先根据要去重的字段姓名,和唯一字段时间,拿到最后一个值,然后根据这个值,作为链接查询的关系,自连,从而完成拿到最后一条数据
5.删除重复数据,只保存一条数据的写法:
Oracle数据库的写法:
DELETE
FROM
dept
WHERE
dname IN ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 过滤出重复的dname
AND deptno NOT IN ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) --
过滤出不在需要保存的id之外的全部id
MySQL数据库:
DELETE
FROM
dept
WHERE
dname IN ( SELECT * FROM ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) a )
AND deptno NOT IN ( SELECT * FROM ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) b )
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]