博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内表查询用到外表
阅读量:6975 次
发布时间:2019-06-27

本文共 1846 字,大约阅读时间需要 6 分钟。

    在 csdn 上看到的一个例子,很多记录中以某个字段为中心最前面的两条数据

 

--给个例子参考

--查询每门课程的前2名成绩

CREATE TABLE StudentGrade(

stuId CHAR(4),    --学号
subId INT,        --课程号
grade INT,        --成绩
PRIMARY KEY (stuId,subId)
)
GO
--表中数据如下
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',1,97);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',2,50);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',3,70);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',1,92);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',2,80);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',3,30);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',1,93);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',2,95);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',3,85);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',1,73);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',2,78);
INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',3,87);
GO
/*
要查询每门课程的前2名成绩
001 1 97
003 1 93
003 2 95
002 2 80
004 3 87
003 3 85
如何实现?
*/
--查看数据
select * from StudentGrade

--假如出现并列时,也只取两个同学的话。
--方法一:
select distinct *
from studentgrade as t1
where stuid in
(select top 2 stuid
 from studentgrade as t2
 where t1.subid=t2.subid
         order by t2.grade desc)
order by subid, grade desc

--方法二:

select * from StudentGrade a where (select count(1) from studentGrade where subId=a.subId and grade>=a.grade)<=2

--方法三:

select * from StudentGrade t
where (select count(1) from StudentGrade where subid=t.subid and grade>t.grade)<=1
order by subId,grade desc

--结果

/*
stuId subId       grade       
----- ----------- ----------- 
001   1           97
003   1           93
003   2           95
002   2           80
004   3           87
003   3           85

(6 row(s) affected)

*/

共有三种方案,从难易程度上讲我倾向于后两种,从查询逻辑思想上来讲后两种是一样的

select * from StudentGrade t

where (select count(1) from StudentGrade where subid=t.subid and grade>t.grade)<=1
order by subId,grade desc

 

转载地址:http://cresl.baihongyu.com/

你可能感兴趣的文章
ES5数组拓展
查看>>
Android内存优化
查看>>
DECIAML字段字节计算
查看>>
电梯媒体吵架再升级,江南春张继学隔空喊话!
查看>>
项目空隙
查看>>
angular组件版本管理器
查看>>
问题MySQL server has gone away
查看>>
iOS的Cookie存取看我绝对够!!
查看>>
Java工程师如何在1个月内做好面试准备?
查看>>
React Transition Group -- TransitionGroup 组件
查看>>
排序算法 JavaScript
查看>>
PAT A1078
查看>>
少走弯路,给Java 1~5 年程序员的建议
查看>>
event_loop中不同异步操作的执行顺序
查看>>
纯链式golang http请求库, 支持HTTP代理
查看>>
类的扩充 js中面向对象的技术
查看>>
css 3D动画
查看>>
一名3年工作经验的java程序员应该具备的职业技能
查看>>
基于CRA,使用Redux、Router、Sass等快速搭建纯前端React项目
查看>>
机器喵之红黑树(一)
查看>>