日期:2014-05-16  浏览次数:20625 次

sql 语句两表查询后根据一个表中的字段排重问题,sql排重问题
用户表:
ID  Name  Email
1   张三   111@qq.com
2   李四   111@qq.com
3   王二   222@qq.com

报名表(这个表用于记录某个用户报名了某个培训班):
ID  U_UserID(与用户表的ID关联)  U_PeiXunBanID(与培训班关联的ID)
1   1                200
2   2                200
3   2                200
4   1                200
5   3                200 
6   1                201 

现在我想查找出报名了id为200的培训班的所有人(搜索结果人数不能重复),并且把用户重复的邮箱进行排重,我使用了下面的语句,如果数据多的时候执行的就超级慢,请问我应该如何优化?

select * from 用户表 where ID in ( select  ID from 用户表 left JOIN 报名表 ON ID = U_UserID where U_PeiXunBanID = 200 group by ID) and ID in (select max(ID) from 用户表 where Email<>'' GROUP BY Email) ;

如果把后面排重Email的语句去掉那么执行的速度就很快,
去掉这句话:and ID in (select max(ID) from 用户表 where Email<>'' GROUP BY Email) 执行速度就很快。

请高人指点!!!


------解决方案--------------------
感觉你的sql逻辑有点混乱。
试试这个

select distinct s.*
from 用户表 s left JOIN 报名表 ON s.ID = U_UserID
where U_PeiXunBanID=200 and 
      not exists(select 1 from 用户表  where s.Email=Email and id>s.ID)

2 李四 111@qq.com
3 王二 222@qq.com

------解决方案--------------------

select * from
(
    select *,ROW_NUMBER() over (partition by Email order by ID desc) as rn
    from [用户表]
) t1 
inner join
(
    select distinct [U_UserID],[U_PeiXunBanID] from [报名表]
    where [U_PeiXunBanID]=200
) t2
on t1.ID = t2.ID


------解决方案--------------------
s是给用户表取的别名
------解决方案--------------------

SELECT T.ID,T.Email,T.Name FROM (
SELECT MAX(ID) ID,Email,MAX(Name) Name FROM 用户表
GROUP BY Email
) T WHERE ID IN (
SELECT U_UserID FROM 报名表
WHERE U_PeiXunBanID=200
)

------解决方案--------------------
select a1,a2,(a1+a2) as a3 from aaa where (a1+a2)<100
------解决方案--------------------
可以这样

select * from
(select ID,Name,Email ROW_NUMBER() over (partition by Email order by ID desc) as rn  from 学员表 ) K
where rn<2;