SQLSERVER中两个表联合条件查询,子查询较多,烦请大神出手看看这条SQL该怎么改执行效率可以高?

如图,现有两个表,现在需要统计到_user表中各用户在_Task中的值,例:要查询 S 值为 2 的,_Type 分别为1,2,3的情况下, 与_user表中T为1的各用户关联的S1和S2的总数。最后得到8列结果,分别是:_user.id, _user.uName, (_Type 为1,S为2时各_User的S1值的和),(_Type 为1,S为2时各_User的S2值的和),(_Type 为2,S为2时各_User的S1值的和),(_Type 为2,S为2时各_User的S2值的和),(_Type 为3,S为2时各_User的S1值的和),(_Type 为3,S为2时各_User的S2值的和)我学SQL的时间不长,只能用笨的方法写出来:SELECT id, uName, (SELECT SUM(s1) FROM _Task WHERE (_User = _User.ID) AND (_type = 1) AND (S = 2), (SELECT SUM(s2) FROM _Task WHERE (_User = _User.ID) AND (_type = 1) AND (S = 2), (SELECT SUM(s1) FROM _Task WHERE (_User = _User.ID) AND (_type = 2) AND (S = 2), (SELECT SUM(s2) FROM _Task WHERE (_User = _User.ID) AND (_type = 2) AND (S = 2) , (SELECT SUM(s1) FROM _Task WHERE (_User = _User.ID) AND (_type = 3) AND (S = 2), (SELECT SUM(s2) FROM _Task WHERE (_User = _User.ID) AND (_type = 3) AND (S = 2)FROM _User WHERE (T = 1)其中,S的值每次查询时都是一样的。这样虽然可以得到想要的结果,但看着都替服务器累,所以烦请大神出手,看有没有执行效率高的好办法?

楼主好,这样写确实是耽误效率。根据楼主的要求,其实可以先全部关联,然后where筛选后在外围汇总。具体SQL如下:

select a.id,a.uName,
sum(case when b._type =1 and S = 2 then s1 else 0 end )as a, 
sum(case when b._type =1 and S = 2 then s2 else 0 end )as b,
sum(case when b._type =2 and S = 2 then s1 else 0 end )as c,
sum(case when b._type =2 and S = 2 then s2 else 0 end )as d,
sum(case when b._type =3 and S = 2 then s1 else 0 end )as e,
sum(case when b._type =3 and S = 2 then s2 else 0 end )as f,
from _User a
join _Task b on a.id=b._User
where a.T=1
group by a.id,a.uName

这样效率应该会高一些。

追问

嗯,谢谢大神,今天青年节,节日快乐,我把 b.S = 2 移动了下位置,好像也可以?

但是这样写的话,只有在B表中有记录的USER才会显示出来,我想把所有的USER全都显示,该怎么改?

追答

改成left join ,然后S=2不要移动就可以了。如果你把S=2移动出去了,那么就是在上述结果之上进行筛选,而不是通过left join进行判定。注意一下执行顺序。另外,如果你想把S=2移动出来,你就要写子查询才可以

追问

好的,在您的提点下,任务完成,小数据量情况下节省资源还不明显,希望在大数据量的情况下能有出色的表现,谢谢!

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-05-03
select a.id , a.uname, b._type , sum(b.s1),sum(b.s2) from _user a, _task b where a.id = b.id and b.s=2 and a.type in (1,2,3)
group by a.id ,a.uname, b._type
这个把S1和S2放在同一行了。不知道你那边有没有用

SQLSERVER中两个表联合条件查询,子查询较多,烦请大神出手看看这条SQL该...
select a.id,a.uName,sum(case when b._type =1 and S = 2 then s1 else 0 end )as a, sum(case when b._type =1 and S = 2 then s2 else 0 end )as b,sum(case when b._type =2 and S = 2 then s1 else 0 end )as c,sum(case when b._type =2 and S = 2 ...

sqlserver sql语句 多条件查询 查询一个表内 单据号最大的记录集...
用子查询吧 select a.门店,b.条码,c.价格 from (select 门店,max(文件号)文件号 from c group by 门店) c left join a on a.条件=c.条件 left join b on b.条件=c.条件 where c.日期 and c.文件号

Mysql单表太大,性能受影响求指点
这么大的表优化是很痛苦的,看你对数据的用途,如果不经常查询、而是频繁的增加,可以考虑定期(每周或者每日)把表中的数据复制到历史表中,清空工作表的数据,这样插入的效率能大大提高,但是查询的时候需要在两个表中进行查询。用于频繁插入数据的工作表要尽量少建索引,用于查询的历史表要多建索引。

sql查询两个字段相同的记录
两种方法,一种是查询重复的数据,只查询重复记录,不管其余信息,如ID什么的:select uid, time from ztest GROUP BY uid, time having count(*)>1;查出结果是 uid time 1 1 还有一种是查询你指定信息,可以查询出ID信息:select distinct a.id, a.uid, a.time from ztest a join zt...

access 数据库 子查询 错误
"品种表"表中"品种"列存在NULL值的原因,改为:select * from 面积表 where 面积>200 and 品种 not in (select 品种 from 品种表 where 品种 is not null)如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!vaela

SQL语言参考大全的目录
5.6.2 将SQL Server中的数据导出到ACCESS中 197第6章 修改和删除数据 1996.1 UPDATE语句的基本语法 2006.2 使用UPDATE语句更新列值 2026.3 利用子查询更新行中的值 2056.3.1 语法格式 2056.3.2 利用子查询返回的行数不多于一行(只返回一个值) 2056.3.3 利用子查询返回多行(返回多个值) 2066.3.4 利用内...

java学习路线
Java学习路线一般有以下几个阶段:第一阶段,JavaSE基础:Java环境搭建、Java流程控制语句-for循环、switch选择判断、循环嵌套、数组拷贝等。第二阶段,JavaWeb:MySQL安装、管理、创建数据库、MySQLUPDATE查询、Mysql高级操作等。第三阶段,Java高级框架-SSH:Struts2异常处理、Struts2+Log4j集成、Struts2和...

相似回答