Как ограничить определенные записи в запросе SELECT - PullRequest
0 голосов
/ 19 мая 2019

Хорошо, у меня есть связь со студентами, которые зачислены на несколько предметов.Большинство студентов были зачислены только за один год, либо в 2015 году, либо в 2016 году, но у меня есть один, который зачислен по предметам с 2015 года, но в некоторых из них он был в 2016 году. Я хочу, чтобы я мог показать студентов, которые были зачислены только в 2015 году.Однако, когда я делаю свое утверждение SELECT, я также беру одного ученика, который изучал этот предмет и в 2016 году.Код субъекта включает год, в который предмет был выполнен.

Некоторые данные из зарегистрированного отношения:

enter image description here

Код:

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 году.

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Один подход использует агрегирование, чтобы утверждать, что код предмета данного учащегося происходит только в течение одного года.

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
    );
0 голосов
/ 19 мая 2019

Вы можете проверить всех студентов, которые НЕ ВХОДЯТ в выбор для студента, КАК '_______ 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_%'

) 
...