求成绩表中各门课程前三名
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
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/archive/2012/03/05/2380525.html