【发布时间】:2009-02-02 17:28:28
【问题描述】:
我想做这样的事情:
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)
但是,您似乎只能将一列与 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。也就是说,如果课程相同,并且学生和时间表专业都为空,则不会删除行。
如果某个属性(例如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)
【讨论】:
下面的语法适用于 SQLServer 但我相信它是标准的 sql
但正如 cmets 中指出的,这是非标准实现,Oracle 目前不支持。
留作参考
delete s
from
student s
inner join schedule sch
on s.course=sch.course
and s.major = sch.major
【讨论】: