现在是遇到这种问题,比如两个表主表base与环节表process现在取主表base的记录和环节号最大的记录关联
base表:
id,
content
process表
id,
baseid,
dealPerson,
dealTime
现在取process表中dealPerson不为空并且id号为最大的处理记录
有两种方法:
第一种
select base.content, process.dealPerson
from base,
(select process1.baseid, process1.dealPerson
from process1
where process.id in
(select max(process2.id)
from process2
where process2.dealPerson is not null)) process
where base.id = process.baseid
前一种写法效率比较高但是条件得写两遍,如果条件比较多,以后维护起来可能比较麻烦,第二种写法效率灰常低。
第二种写法会出现的问题:
表base
字段 id,key,data
按key分组取data有最大值的记录
select *
from base
where base.data in
(select max(base.data) from base group by base.key)
这样写看似没有问题,其实如果max(base.data)有与base表的非max(base.data)有相同值得情况会出现重复记录,比如郭key=a的时候data取2为最大,key=b的时候data取3为最大,并且key=b时data有值为2的情况,则会把data=2的这条记录也取出来。当然如果data没有重复记录则不会出现这样的问题
所以:正确的写法
select *
from base
where base.data in
(select max(base1.data) from base base1 where base1.key = base.key group by base1.key)