我想做类似的事情:
DELETE FROM student WHERE
student.course, student.major IN
(SELECT schedule.course, schedule.major FROM schedule)
但是,您似乎只能在IN运算符中使用一列。真的吗?看起来像这样的查询应该是可能的。
答案 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