1.PARTITION 作为开窗函数,可以实现在子查询中根据某列分组,再根据某个条件排序,获取到该子查询中的一条数据
select a.*,b.num,b.ID,b.name,b.Score from tableA a inner join (select name,ROW_NUMBER () OVER (PARTITION BY name ORDER BY CreatedTime DESC ) AS num,Score from TableB) b on a.BID=b.ID AND b.num=1
以上sql使用开窗函数从TableB中提取数据并关联TableA进行数据展示,TableB中每个name下的最新记录(基于CreatedTime),获取tableB最新评分。
缺点是会将TableB中所有数据纳入检索范围,且无法有效利用TableB.ID的索引
使用CROSS APPLY修改一下
select a.*,b.ID,b.name,b.Score from tableA a CROSS APPLY (SELECT TOP 1 name,CreatedTime,ScoreFROM TableBWHERE ID=a.BIDORDER BY CreatedTime DESC ) b
数据结果一样,查询效率得到了提升!