sql - 获取教师和学生的 SQL 查询具有无效标识符
问题描述
嗨,我有一个看起来像这样的架构
我做了两个必须这样做的查询:
找出教授最多不同课程的前 4 位教师的姓名。还显示教授的课程总数。
- 输出列:
InstructorName
,NumberOfCoursesTaught
- 排序方式:
NumberOfCoursesTaught
降序
- 输出列:
找出参加过最多课程的前 2 名学生。
输出列:
S_ID
,StudentName
,NumberOfCourses
排序方式:
NumberOfCourses
降序
对于查询 1,我写道:
SELECT name AS InstructorName, count(course_id) AS NumberOfCourses
FROM Teaches
WHERE name IN (SELECT name FROM Instructor where Instructor.i_id = Teaches.i_id)
GROUP BU i_id
ORDER BY COUNT(course_id) DESC;
对于查询 2,我写了
SELECT s_id as S_ID, name as StudentName, count(course_id) as NumberOfCourses
FROM Takes
WHERE name IN (SELECT name FROM Student WHERE Takes.s_id = Student.s_id)
GROUP BY s_id
ORDER BY COUNT(course_id) DESC;
两人都说:
"NAME" 无效标识符
解决方案
我建议您应该使用另一种逻辑来构建您的查询。这是第一个查询的演示;从那里开始,您应该能够创建第二个查询(并可能将其作为答案发布?)。
从一个聚合查询开始,该查询计算每个讲师 ID 的教员数量,查看下Teaches
表:
SELECT i_id, COUNT(*) cnt FROM Teaches GROUP BY i_id
然后使用窗口函数通过减少计数对每条记录进行排名ROW_NUMBER()
:
SELECT i_id, cnt, ROW_NUMBER() OVER(ORDER BY cnt DESC) rn
FROM (SELECT i_id, COUNT(*) cnt FROM Teaches GROUP BY i_id) t
剩下要做的就是获取讲师姓名 ( JOIN ON Instructor
) 并筛选前 4 条记录
SELECT i.name InstructorName, x.cnt NumberOfCoursesTaught
FROM (
SELECT i_id, cnt, ROW_NUMBER() OVER(ORDER BY cnt DESC) rn
FROM (SELECT i_id, COUNT(*) cnt FROM Teaches GROUP BY i_id) t
) x
INNER JOIN Instructor i ON i.i_id = x.i_id
WHERE x.rn <= 4
ORDER BY x.cnt desc
推荐阅读
- google-maps - 商业 API 密钥不起作用:此页面无法正确加载谷歌地图
- mule - DataWeave 2.0 反斜杠转义
- r - 如何从 r 中的数据框中删除“很多”行
- javascript - 如何在 webgl 中使用 uv 纹理包裹空间以制作黑洞
- c# - 使用第三方对象实例化测试代码
- c# - 在内部 .NET Framework 方法中花费的分析时间
- excel - VBA如何从应用程序调用者地址中选择和偏移?
- python - 变量范围和共享“全局”参考数据帧
- json - ColdFusion前缀序列化JSON
- angular - 使用 ngSwitch 而不是 router-outlet,因为在 router-outlet 指令中缺乏对 @Input 的支持