SQL Server 2005 新增 cross apply 和 outer apply 联接语句,
apply和join操作有什么不一样呢?apply如何使用?
可以参见文章:
使用apply可以轻松实现row_number效果:
举例如下:(问题来自论坛)链接直达:求一个不同班级人对应不同成绩等级的查询!
需求:
不同班级的同学,成绩对应不同等级,且不同等级的数量还不同。如1班分 90分优秀,80分良好,70中等,60分及格四挡,2班分,85分良好,60及格两档。
有表如下,简易的表,如果需要辅助列可以随便加的。
人员表
eid score did
人员的id 获得的分数 对应的班级id
1 90 1
2 80 1
3 72 1
4 90 2
5 80 2
6 72 2
等级表
id score title
班级id 分数 等级名称
1 90 优秀
1 80 良好
1 70 中等
1 60 及格
2 85 良好
2 60 及格
创建表语句:
create table students(sid int ,score int,did int )
insert into students
select 1,90,1
union
select 2,80,1
union
select 3,72,1
union
select 4,90,2
union
select 5,80,2
union
select 6,72,2
create table degres(id int ,score int,title varchar(20))
insert into degres
select 1,90,'优秀'
union
select 1,80,'良好'
union
select 1,70,'中等'
union
select 1,60,'及格'
union
select 2,85,'良好'
union
select 2,60,'及格'
实现方法一:使用Row_Number函数和join方法:
联合查询,取大于等级分数中最大的那个等级就可以了(按人分组,order by 等级分数降序,取第一个)
实现代码:
select a.sid,a.score,a.did,a.title from (
select s.*,d.title ,
row_number() over(partition by s.sid order by d.score desc) as n
from students as s
left join degres as d on s.did=d.id
where s.score>=d.score
)as a where n=1
方法二:使用apply函数,实现代码如下:
SELECT students.*,f.title
FROM students OUTER APPLY (
SELECT TOP 1 deg.title FROM dbo.degres as deg WHERE deg.id=students.did AND students.score>=deg.score ORDER BY deg.score DESC
) AS f
/*
eid score did title
1 90 1 优秀
2 80 1 良好
3 72 1 中等
4 90 2 良好
5 80 2 及格
6 72 2 及格
*/
答案来自CSDN用户分享:吉普赛的歌
分享文章:T-SQL Apply的用法
分享论坛问题:求一个不同班级人对应不同成绩等级的查询!