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使用更简洁高效,但不要盲目使用。