sqlserver 使用CROSS APPLY替代PARTITION,简化子查询并提升查询效率

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,Score
    FROM TableB
    WHERE ID=a.BID
    ORDER BY CreatedTime DESC
) b

数据结果一样,查询效率得到了提升!

 

posted @ 2025-02-11 10:15  蜀南蓝玉  阅读(111)  评论(0)    收藏  举报