Ответ 1
Нет, вам просто нужны скобки:
DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)
Я хочу сделать что-то вроде:
DELETE FROM student WHERE
student.course, student.major IN
(SELECT schedule.course, schedule.major FROM schedule)
Однако кажется, что вы можете использовать только один столбец с оператором IN. Это правда? Похоже, такой запрос должен быть возможен.
Нет, вам просто нужны скобки:
DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)
Вы также можете использовать предложение EXISTS:
DELETE FROM student WHERE
EXISTS
(
SELECT 1 FROM schedule
WHERE schedule.course=student.course
AND schedule.major=student.major
)
DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)
Поместите парсеры вокруг своих условий в предложение where. Ура!
В Oracle вы можете сделать удаление из строкового представления, но обычно требуется внешний ключ, который гарантирует, что строка из таблицы, из которой была удалена строка, не может быть представлена более чем одной строкой в представлении.
create table parent (id number primary key);
create table child (id number primary key, parent_id number references parent);
insert into parent values(1);
insert into child values(2,1);
delete from (select * from parent p, child c where c.parent_id = p.id);
Обратите внимание, что если любые атрибуты равны нулю, строка считается не IN. То есть, если курсы равны, а оба ученика и основной мажор имеют значение null, строка не будет удалена.
Если атрибут, например major, может быть нулевым, и вы хотите, чтобы значение null = null было истинным, попробуйте:
DELETE
FROM student
WHERE (student.course, NVL(student.major,'sOmeStRinG') )
IN (SELECT schedule.course, NVL(schedule.major,'sOmeStRinG') FROM schedule)
Синтаксис ниже работает в SQLServer , но я считаю, что это стандартный sql
но, как указано в комментариях, это нестандартная реализация и в настоящее время не поддерживается в Oracle.
Я оставлю его для справки
delete s
from
student s
inner join schedule sch
on s.course=sch.course
and s.major = sch.major