求成绩表中各门课程前三名

create table #(student varchar(10), class varchar(10), score decimal(9,2)

) ON [PRIMARY]



insert # values('A', 'C1', 100)

insert # values('B', 'C1', 80)

insert # values('C', 'C1', 70)

insert # values('E', 'C1', 70)

insert # values('D', 'C1', 60)

insert # values('A', 'C3', 100)



select * from # a where score in(select top 3 score from # where class=a.class order by score desc)

查询结果:

 
student class   score
A C1 100
B C1   80
C C1 70
E C1 70
A C3 100

 

一个同事给的sql是:

select * from # a where student in(select top 3 student from # where class=a.class order by score desc)

 即判断条件依据的是student字段。 查询结果为:

 
student class   score
A C1 100
B C1   80
E C1 70
A C3 100

可以看出来它们的区别:如果筛选结果有相同成绩的, 前者会全部显示出来,即所谓的并列名次。 而后者,仅取了其中的一条记录。

不太明白的是:为什么C1课程的第三名学生是E,而不是C?


如果为临时表创建索引,即

create table #(student varchar(10), class varchar(10), score decimal(9,2)

CONSTRAINT [PK_tmp] PRIMARY KEY CLUSTERED 

(

	student asc,

	class asc

)

) ON [PRIMARY]

 则第三名学生为C

你可能感兴趣的:(表)