以下是我要解决的问题: ( 列出尚未在任何部分中获得任何成绩的学生的学生姓名,部分ID和课程编号 )
到目前为止我所拥有的是
SELECT UNIQUE G.STUDENT_ID,G.SECTION_ID,S.COURSE_NO
FROM GRADE G
FULL OUTER JOIN ENROLLMENT E
ON (E.STUDENT_ID = G.STUDENT_ID)
FULL OUTER JOIN SECTION S
ON (E.SECTION_ID = S.SECTION_ID)
WHERE G.STUDENT_ID NOT IN (
SELECT UNIQUE SS.STUDENT_ID
FROM STUDENT SS
LEFT OUTER JOIN ENROLLMENT EE
ON (SS.STUDENT_ID = EE.STUDENT_ID)
LEFT OUTER JOIN SECTION SSE
ON (EE.SECTION_ID = SSE.SECTION_ID)
FULL OUTER JOIN GRADE GG
ON (GG.STUDENT_ID = EE.STUDENT_ID)
WHERE GG.NUMERIC_GRADE IS NOT NULL )
基本上我试图找到没有空值的学生的student_id,这意味着他们确实在至少一种等级中有一个等级。
我的主要目标是找到那些在任何年级类别中都有成绩的学生。然后使用该数据将这些学生从主查询中删除。
到目前为止,我的问题是,当我运行查询时,它会删除所有学生,而不仅仅是子查询所提取的学生。
答案 0 :(得分:0)
嗯。 。 。我想起了NOT EXISTS
或NOT IN
。
SELECT E.STUDENT_ID, E.SECTION_ID, S.COURSE_NO
FROM ENROLLEMENT e JOIN
SECTION s
ON E.SECTION_ID = S.SECTION_ID
WHERE NOT EXISTS (SELECT 1
FROM GRADE G
WHERE E.STUDENT_ID = G.STUDENT_ID
);
从技术上讲,这可以让所有没有成绩的学生。您的数据模型和问题有点不清楚。如果您只想在学生注册的部分中没有成绩,那么您应该在子查询条件中包含该部分或类。