Oracle удаляет строки, соответствующие нескольким значениям - PullRequest
26 голосов
/ 02 февраля 2009

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

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

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

Ответы [ 6 ]

44 голосов
/ 02 февраля 2009

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

DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)
14 голосов
/ 03 февраля 2009

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

DELETE FROM student WHERE
EXISTS
(
  SELECT 1 FROM schedule 
  WHERE schedule.course=student.course 
  AND schedule.major=student.major
)
7 голосов
/ 02 февраля 2009
DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)

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

3 голосов
/ 06 апреля 2012

Обратите внимание, что если какие-либо атрибуты имеют значение null, строка считается не IN. То есть, если курсы одинаковы, а учащийся и основной график равны нулю, строка не будет удалена.

Если атрибут, такой как major, может иметь значение NULL и вы хотите, чтобы значение NULL = NULL было истинным, попробуйте:

DELETE
FROM student
WHERE (student.course, NVL(student.major,'sOmeStRinG') )
IN (SELECT schedule.course, NVL(schedule.major,'sOmeStRinG') FROM schedule)
3 голосов
/ 03 февраля 2009

В 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);
2 голосов
/ 02 февраля 2009

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

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

delete s
from 
    student s 
    inner join schedule sch
    on s.course=sch.course 
    and s.major = sch.major
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...