首页 > 解决方案 > 获取教师和学生的 SQL 查询具有无效标识符

问题描述

嗨,我有一个看起来像这样的架构

架构的图像

我做了两个必须这样做的查询:

  1. 找出教授最多不同课程的前 4 位教师的姓名。还显示教授的课程总数。

    • 输出列:InstructorName,NumberOfCoursesTaught
    • 排序方式:NumberOfCoursesTaught降序
  2. 找出参加过最多课程的前 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" 无效标识符

标签: sqloracle

解决方案


我建议您应该使用另一种逻辑来构建您的查询。这是第一个查询的演示;从那里开始,您应该能够创建第二个查询(并可能将其作为答案发布?)。


从一个聚合查询开始,该查询计算每个讲师 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

推荐阅读