题目要求:
这个表可能包含重复数据(换句话说,在 SQL 中,这个表没有主键)。
学生表里的一个学生修读科目表里的每一门科目。
这张考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。
查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序。
查询结构格式如下所示。
示例 1:
这个题目一开始掉入了坑里,没仔细看 直接把三张表连接起来。后来导致结果报错
select
st.student_id ,
st.student_name ,
su.subject_name,
count(1)
from Subjects Su
left join Examinations Ex
on su.subject_name = ex.subject_name
left join Students st
on st.student_id = ex.student_id
group by st.student_id ,
st.student_name ,
su.subject_name
order by st.student_id ,
st.student_name
运行结果: 报错了
后来仔细思考了一下 应该用到笛卡尔(Cross)连接
直接用了最简单的方式 没写 cross
SELECT *
FROM Students A5,Subjects A6
WHERE 1 = 1
运行结果:
在此基础上 进行分组完善补充代码
正确答案:
SELECT
A1.STUDENT_ID student_id ,
A1.STUDENT_NAME student_name ,
A1.SUBJECT_NAME subject_name ,
NVL(A2.ct,0) attended_exams
FROM (
SELECT *
FROM Students A5,Subjects A6
WHERE 1 = 1 ) A1
LEFT JOIN (SELECT student_id ,subject_name ,count(*) ct
FROM Examinations
GROUP BY student_id ,subject_name) A2
ON A1.student_id = A2.student_id
AND A1.SUBJECT_NAME = A2.SUBJECT_NAME
ORDER BY A1.STUDENT_ID,A1.SUBJECT_NAME
运行结果: