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

   今天开发数据库两张表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

 

 

 

 

 

 

你可能感兴趣的:(数据库中 join 链接过滤重复的记录)