SQL。选择一个没有附加特定值的值列表

时间:2017-09-29 00:51:31

标签: mysql sql

以下是我要解决的问题: ( 列出尚未在任何部分中获得任何成绩的学生的学生姓名,部分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,这意味着他们确实在至少一种等级中有一个等级。

我的主要目标是找到那些在任何年级类别中都有成绩的学生。然后使用该数据将这些学生从主查询中删除。

到目前为止,我的问题是,当我运行查询时,它会删除所有学生,而不仅仅是子查询所提取的学生。

1 个答案:

答案 0 :(得分:0)

嗯。 。 。我想起了NOT EXISTSNOT 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
                 );

从技术上讲,这可以让所有没有成绩的学生。您的数据模型和问题有点不清楚。如果您只想在学生注册的部分中没有成绩,那么您应该在子查询条件中包含该部分或类。