oracal取从表最大值

现在是遇到这种问题,比如两个表主表base与环节表process现在取主表base的记录和环节号最大的记录关联
   base表:
          id,
        content
   process表
          id,
          baseid,
         dealPerson,
         dealTime

现在取process表中dealPerson不为空并且id号为最大的处理记录
有两种方法:
    第一种

select base.content, process.dealPerson
  from base, process
 where base.id = process.baseid
   and process1.dealPerson is not null
   and not exists (select 1
          from process1
         where process1.baseid = process.baseid
         process1.dealPerson is not null
           and process1.id > process.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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值