首页 > 技术文章 > apply 用法(1)-join比较

2019-11-11 2020-08-10 15:40 原文

apply包含 cross apply(对应inner join)和outer apply (对应 left join)

拿实例说明用法和性能比较 apply 两种用法语法上相同下面仅用cross apply 举例

TableA (id,buydate,client,gift,num ) id 自增列,gift礼品,num 数量,client 消费者,buydate 时间。现获取消费者首日购买的最后一件礼品。

--写法上  在这种涉及组内(一个client会有多条购买记录,可以把client看做一个组)数据处理的情况,apply更简洁明了。 from后接组成员表,apply后接组成员数据明细表。

     

  --inner join用法

  --获取首日
  select client,min(buydate) mindate into #mindate from TableA   group by client

  --获取首日末次id
  select TableA .client,max(id)maxid into #maxid from TableA  
  inner join #mindate on TableA .client=#mindate.client
  where TableA .buydate=#mindate.mindate
  group by TableA .client

  --获取首日末次记录
  select TableA .* from TableA   
  inner join #maxid on TableA .id=#maxid .maxid

  --cross apply 用法

  --获取首日
  select client,min(buydate) mindate into #mindate from TableA group by client

  --获取首日末次记录
  select t.*
  from #mindate 
  cross apply (select top 1 * from TableA 
                        where TableA.client=#mindate.client and 
                        TableA.buydate=#mindate.mindate order by id desc
                      ) t

        --性能上

        实际业务中,不仅要考虑代码的简洁还要考虑性能,最好的当然是既简洁又高效。当组成员表数量较少,组成员数据明细表又较大时,apply性能更优(测试组成员表2W,组成员数据明细表5000W);当组成员数量较大时,join性能更优更稳定(测试组成员表400W,组成员数据明细表5000W)。

        apply是对join的补充,在特定情况下要比join使用更简洁高效,但不要盲目使用。    

推荐阅读