Удаление данных с подзапросом
Есть задача, делаю разными способами и не понимаю, почему не получается. Код работает, но данные не удаляются. Посмотрите кто-то "трезвым взглядом", а то не понимаю в чем ошибка.
Задача: "В учебных заведениях Украины проведена реформа и все студенты, у которых средний бал не превышает 3.5 балла - отчислены из институтов. Сделайте все необходимые удаления из БД."
Мои варианты решения:
№1
delete from students where ID in(
select STUDENT_ID
, avg(mark)
from EXAM_MARKS
group by Student_ID having AVG(mark) < 3.5)
№2
delete STUDENTS from STUDENTS where exists(
select 1 from EXAM_MARKS as EM
where STUDENTS.ID = EM.STUDENT_ID
group by Student_ID having avg(Mark) < 3.5 )
№3
DELETE STUDENTS FROM students s
INNER JOIN exam_marks as em ON s.id = em.student_id
WHERE s.id IN(
SELECT student_id FROM exam_marks
GROUP BY student_id
HAVING AVG(mark) <= 3.5)
Ответы (1 шт):
Первый ваш вариант самый правильный. Оператор IN в SQL принимает справа либо список, либо подзапрос, результат которого состоит из одного столбца. В вашем случае в подзапросе написано select STUDENT_ID, avg(mark), из-за чего он возвращает два столбца.
Исправленный код:
DELETE FROM students
WHERE id IN (
SELECT student_id FROM exam_marks
GROUP BY student_id
HAVING AVG(mark) < 3.5
);
Из документации Transact-SQL: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/in-transact-sql?view=sql-server-ver15#arguments