我首先要说这是家庭作业,我不是在寻找解决方案。我只是在寻找有关我已经尝试过的内容的确认/提示。基本上,有表:
学生(姓名,学生编号,班级,专业)
GRADE_REPORT(Student_number, Section_identifier, Grade)
我需要检索所有 A 级学生(所有课程成绩为 A 级的学生)的姓名和主要部门。
这是我想出的:
SELECT Name, Major
FROM STUDENT s JOIN GRADE_REPORT g
ON s.Student_number = g.Student_number
WHERE NOT EXISTS
(SELECT Grade
FROM GRADE_REPORT
WHERE Grade <> ‘A’
AND Student_number = s.Student_number)
Run Code Online (Sandbox Code Playgroud)
同样,只寻找有关编写查询的确认和提示。我对编写查询很陌生,但对其背后的逻辑仍然有些困惑。
对此有不同的方法。
在你的尝试中。您的第一部分不需要JOIN. 您正在带学生和过滤您不想要的学生的地方。如果你仔细看,你会意识到不要使用GRADE_REPORT桌子上的任何东西。
SELECT Name, Major
FROM STUDENT s JOIN GRADE_REPORT g
ON s.Student_number = g.Student_number
Run Code Online (Sandbox Code Playgroud)
但即使有了这个附加值,也JOIN应该给你带来你想要的结果。
现在更好的解决方案是使用JOIN和使用GROUP BY+HAVING来过滤学生
SELECT Name, Major
FROM STUDENT s
JOIN GRADE_REPORT g
ON s.Student_number = g.Student_number
GROUP BY Name, Major
HAVING COUNT(CASE WHEN g.Grade <> 'A' THEN 1 END) = 0
Run Code Online (Sandbox Code Playgroud)
现在在这里你加入两个表并使用 aCONDITIONAL COUNT来查看有多少学生成绩没有'A',并且只会返回那些有 0 的成绩
优点是去除子查询提高整体性能
| 归档时间: |
|
| 查看次数: |
1251 次 |
| 最近记录: |