Oracle删除行匹配多个值

时间:2009-02-02 17:28:28

标签: sql oracle

我想做类似的事情:

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

但是,您似乎只能在IN运算符中使用一列。真的吗?看起来像这样的查询应该是可能的。

6 个答案:

答案 0 :(得分:44)

不,你只需要括号:

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

答案 1 :(得分:14)

您也可以使用EXISTS子句:

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

答案 2 :(得分:7)

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

在where子句中放置关于条款的parens。干杯!

答案 3 :(得分:3)

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

答案 4 :(得分:3)

请注意,如果任何属性为null,则该行被视为不是IN。也就是说,如果课程相同且学生和学历专业都为空,则不会删除行。

如果某个属性(例如major)可能为null,并且您希望null = null为true,请尝试:

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

答案 5 :(得分:2)

下面的语法适用于SQLServer ,但我相信它是标准的sql 但正如评论中指出的那样,这是非标准实现,Oracle目前不支持。

我会留待参考

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