我们做项目难免遇到统计,比如统计不同状态下订单的总数。表的主体都是订单表,只是后面where不同,如果我要一次性返回不同条件下的总数,应该怎么写sql呢?
来看我最开始的写法:(以下伪代码)
select (查询结果集and条件1) count1,(查询结果集and条件2) count2,(查询结果集and条件3) count3
如果是单表查询还好,括号内的sql不会很长,但如果是那种需要关联很多结果集的查询,三个括号加起来的代码就很臃肿了,而且重复的地方太多。
来看最后优化后的写法:
select ( case when 条件1 then 1 else null end )count1, ( case when 条件2 then 1 else null end )count2, ( case when 条件3 then 1 else null end )count3
from 查询结果集
这样就做到了代码简化,第一种其实是查询多次拼接在一起,第二种则不然,只查了一次。
关于为啥突然写起这个,唔,只想说linq to sql有点难用,费劲,在以EF为ORM的项目中,linq to sql的查询方式很常见,但是这个东西往往容易和linq查询分不开,或者极其容易混写,如:
var res=( from a in t ).Where(....) ;
要仔细看了,在()后Where和在()里面where是不一样的,在括号里面写where是linq to sql,会转换成sql代码执行,但是括号外面的Where则是linq查询,说简单点就是已经执行过sql,然后在内存上筛选数据。这样的性能是比不上前者的,后者会返回大量数据加载到内存,如果你的Where很复杂会导致超时!
不说了,都是泪,以上。