好的,所以我与多个学科的学生有联系。大多数学生仅在2015年或2016年入学,但我有一个从2015年开始入学的科目,但在2016年也有一些。我希望能够显示仅在2015年入学的学生。但是,当我执行SELECT语句时,我同时也抓住了一位在2016年完成该主题的学生。主题代码包括主题完成的年份。
一些来自已注册关系的数据:
代码:
SELECT s.firstName, d.degreeCode
FROM students s, degrees d, enrolled e
WHERE s.studentID = d.studentID AND s.studentID = e.studentID AND e.subjectCode NOT LIKE '_______16__'
GROUP BY firstName;
因此,我获得了所有15年级就读的学生,但我不希望成绩表中出现s3,因为他也在2016年学习。
答案 0 :(得分:2)
一种方法是使用聚合来断言给定学生的主题代码仅在一年内发生。
SELECT s.firstName, d.degreeCode
FROM students s
INNER JOIN degrees d
ON s.studentID = d.studentID
INNER JOIN ENTROLLED e
s.studentID = e.studentID
WHERE
SUBSTRING(e.subjectCode, 8, 2)) = '15' AND
s.studentID NOT IN (
SELECT d.studentID
FROM degrees d
INNER JOIN enrolled e
ON d.studentID = e.studentID
GROUP BY d.studentID
HAVING COUNT(DISTINCT SUBSTRING(e.subjectCode, 8, 2)) > 1
);
答案 1 :(得分:0)
您可以检查所有未选中的学生,例如“ _______ 16 __”。
SELECT s.firstName, d.degreeCode
FROM students s
INNER JOIN degrees d ON s.studentID = d.studentID
INNER JOIN enrolled e AND s.studentID = e.studentID
WHERE s.StudentID NOT IN (
select studentID
FROM students s
INNER JOIN degrees d ON s.studentID = d.studentID
INNER JOIN enrolled e AND s.studentID = e.studentID
WHERE e.subjectCode NOT LIKE '%_15_%'
)