当前位置: 代码迷 >> Sql Server >> 请问SQL语句简化
  详细解决方案

请问SQL语句简化

热度:32   发布时间:2016-04-24 09:29:06.0
请教SQL语句简化
各位老师,我拟进行两个表之间的统计,主表t_main,明细表t_work,两表用userid字段关联,
现在按单位统计每个userid的工作明细情况,写了如下语句,感觉很幼稚,哪位老师教我一个更好的语句?
谢谢!


select userid
,username
        ,unit
,(SELECT COUNT(*) FROM t_work where userid=t_main.userid) as count1
,(SELECT COUNT(*) FROM t_work where userid=t_main.userid AND ifsofar=1) as count2
from t_main
where unit = '1002'

------解决思路----------------------
相关子查询效率在确实比较低,不过,如果你的t_work的数据量如果很少的话,还是可以用的
建议用左连接
select
T1.userid
,T1.username
,T1.unit
    ,COUNT(1)count1
    ,COUNT(CASE WHEN T2.ifsofar=1 THEN 1 END)count2
from t_main T1
LEFT JOIN t_work T2 ON T1.userid=T2.userid
where T1.unit = '1002'
GROUP BY
T1.userid
,T1.username
,T1.unit

------解决思路----------------------
引用:

-- 你写的那个,最大的问题在于 t_work 这两表扫描了两次,效率有影响,别的没什么问题。
-- 这里使用的是 left join ,你百度一下它和 inner join 的区别。
select m.userid , m.username , m.unit , 
sum(1) as count1 , 
sum(case when ifsofar =1 then 1 else 0 end ) as count2 
from t_main m left join t_work w on m.userid = w.userid 
group by  m.userid , m.username , m.unit






select m.userid , m.username , m.unit , 
-- sum(1)?as?count1?,?
count(w.userid) as count1 ,   上面那句,换成这个
sum(case when ifsofar =1 then 1 else 0 end ) as count2 
from t_main m left join t_work w on m.userid = w.userid 
group by  m.userid , m.username , m.unit


[/code]
  相关解决方案