Подтвердить что ты не робот

Oracle Delete Строки, соответствующие нескольким значениям

Я хочу сделать что-то вроде:

DELETE FROM student WHERE
student.course, student.major IN
(SELECT schedule.course, schedule.major FROM schedule)

Однако кажется, что вы можете использовать только один столбец с оператором IN. Это правда? Похоже, такой запрос должен быть возможен.

4b9b3361

Ответ 1

Нет, вам просто нужны скобки:

DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)

Ответ 2

Вы также можете использовать предложение EXISTS:

DELETE FROM student WHERE
EXISTS
(
  SELECT 1 FROM schedule 
  WHERE schedule.course=student.course 
  AND schedule.major=student.major
)

Ответ 3

DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)

Поместите парсеры вокруг своих условий в предложение where. Ура!

Ответ 4

В 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);

Ответ 5

Обратите внимание, что если любые атрибуты равны нулю, строка считается не 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)

Ответ 6

Синтаксис ниже работает в SQLServer , но я считаю, что это стандартный sql но, как указано в комментариях, это нестандартная реализация и в настоящее время не поддерживается в Oracle.

Я оставлю его для справки

delete s
from 
    student s 
    inner join schedule sch
    on s.course=sch.course 
    and s.major = sch.major