数据库中 join 链接过滤重复的记录

来源:互联网 发布:k中心点文本挖掘java 编辑:程序博客网 时间:2024/04/30 13:20

   今天开发数据库两张表p_zxts ,p_zxts_reply ,咨询问题,和咨询答复表(可以答复两次及两次以上),查询咨询问题列表同时查询是否已经答复的状态,一次性查出来

如果用左连接 有查询出重复的记录

 

下面介绍过滤重复记录两种方法:

 

1 、sql函数的方法

  select m.* from (select r.tid as id ,z.*,row_number()over(partition by z.tid order by sys_guid()) rn from p_zxts z left join p_zxts_reply r on z.tid=r.questionid )m where rn=1 order by m.datetime desc

 

2、利用group by的方法

 

select p.*,m.id from p_zxts p inner join(select z.tid,max(r.tid) as id from p_zxts z left join p_zxts_reply r on z.tid=r.questionid group by z.tid)m on p.tid=m.tid

 

第二种应该是比较常用一些

 

查询及删除数据库中的重复记录

 

有张表pepole ,字段有pepoleID  .name ,addree

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select * from people   where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)  
 
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people    where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)   and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)  
 
3、查找表中多余的重复记录(多个字段)
select * from people a   where (a.peopleId,a.name) in  (select peopleId,name from vitae group by peopleId,name having count(*) > 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
 

delete from people a   where (a.peopleId,a.name) in  (select peopleId,namefrom vitae group by peopleId,namehaving count(*) > 1) and rowid not in (select min(rowid) from namegroup by peopleId,namehaving count(*)>1)  

HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

 

 

如果没有主键重复记录可以用

 

select distinct * from tableName

 

 

 

 

 

 

原创粉丝点击