SQL- Найти студентов, которые не получают оценки в базе данных - PullRequest
1 голос
/ 01 ноября 2019

У меня есть три таблицы в моей базе данных. первый - студенты, у которых первичный ключ - student_id. второй - таблица курсов, в которой первичный ключ имеет course_id, и, наконец, у меня есть таблица оценок, в которой внешними ключами являются id_student и id_course, а также поле оценки. Я хочу получить подробную информацию о студентах, которые пропускают свои оценки в таблице оценок. Я искал переполнение стека, но не смог найти точный ответ, который я ищу. и что я пробовал до сих пор, это следующий запрос:

select st.student_id,
       st.lname,
       st.fname,
       cs.course_id,
       g.grade 
from students st 
join grades g 
   on g.id_student = st.student_id 
join courses cs 
   on cs.course_id = g.id_course 
where g.grade is null

Если я попробую этот же запрос без условия, я получу 39 строк, но я должен получить 40, потому что в моей базе данных есть один студент, который отсутствуетоценки в course_id 20. ** пропущенная вещь - student_id, где course_id - 20, а оценка для него не существует. **

this is my students table

this is courses table enter image description here

Ответы [ 3 ]

3 голосов
/ 01 ноября 2019

Я думаю, join на grades требует две клавиши. Если я предполагаю, что студенты должны проходить все курсы, то это будет выглядеть так:

select st.student_id, st.lname, st.fname, cs.course_id,
       g.grade 
from students st cross join
     courses c left join
     grades g 
     on g.id_student = st.student_id and
        g.id_course = c.course_id
where g.grade is null;

* CROSS JOIN генерирует все комбинации студентов и курсов. LEFT JOIN / WHERE отфильтровывает недостающие оценки.

0 голосов
/ 01 ноября 2019

Функция соединения для таблицы оценок ищет только результаты, которые соответствуют таблице показателей и таблице учащихся. Попробуйте выполнить полное внешнее соединение, чтобы включить все поля независимо от того, совпадают ли они в обеих таблицах. Смотрите код ниже:

SELECT 
st.student_id, st.lname, st.fname, cs.course_id, g.grade

FROM students st

FULL OUTER JOIN grades g
ON g.id_student = st.student_id

FULL OUTER JOIN courses cs
ON cs.course_ID = g.id_course

WHERE g.grade IS NULL
0 голосов
/ 01 ноября 2019

Поскольку вы используете JOIN, вы получаете только те строки, которые существуют во всех трех таблицах.

Если вы измените JOINS на LEFT OUTER JOIN, вы увидите NULLS для ученика без оценки.

См. https://www.w3schools.com/sql/sql_join.asp и многие другие ссылки в Интернете.

SELECT * FROM
(
select st.student_id,st.lname,st.fname,cs.course_id,g.grade 
from students st 
LEFT OUTER join grades g on g.id_student = st.student_id 
LEFT OUTER join courses cs on cs.course_id = g.id_course 
)SUB_Q WHERE SUB_Q.grade IS NULL

Внутренний запрос должен возвращать всех учащихся, а те, у кого нет оценки, должны иметь нулевую оценку. Таким образом, предложение WHERE внешнего запроса должно фильтроваться только до них.

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