【发布时间】:2015-05-29 18:29:20
【问题描述】:
我正在尝试将 DELETE FROM 与 IN 子句和子查询一起使用,以删除另一个表上的查询给出的行,该表与我要从中删除的表是一对一的,但是 Oracle 11g2 barfs对我来说是一个完全无用的 ORA-00900 错误,如下面的 SQL 小提琴:
http://sqlfiddle.com/#!4/93171/1
对于那些无法使用 SQLfiddle 的人,我使用的架构/初始负载是(我使用 varchar 而不是 varchar2 用于测试可移植性,“野生”数据使用 varchar2 ):
create table obj (id integer primary key, data varchar(100));
create table meta(id integer primary key, imported char(1));
insert into obj (id, data) values (1, 'foo');
insert into obj (id, data) values (2, 'bar');
insert into obj (id, data) values (3, 'baz');
insert into obj (id, data) values (4, 'blurf');
insert into obj (id, data) values (5, 'hurf');
insert into meta (id, imported) values (1, 'T');
insert into meta (id, imported) values (2, 'F');
insert into meta (id, imported) values (3, 'T');
insert into meta (id, imported) values (4, 'F');
insert into meta (id, imported) values (5, 'F');
我要运行的语句是:
delete from obj where obj.id in (select meta.id from meta where meta.imported = 'F');
select * from obj full outer join meta on obj.id = meta.id;
(select ... full outer join自行运行,如果我仍然注释掉它仍然会发生错误,所以它不是ORA-00900的来源。)
附:该语句也是有效的 SQL —— SQL Server 2014 和 PostgreSQL 9.3 都没有问题,一旦full outer join 切换为inner join,它也可以在 SQLite 3.8.8.3 的本地副本中工作。
【问题讨论】:
-
可能是 SQLFiddle 中的一个错误,在我的本地 Oracle 版本
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production上运行正常。 -
如果
delete在架构定义的左侧,您的 SQL Fiddle 运行良好。只有select在右侧工作。 (sqlfiddle.com/#!4/0a120/2) -
@GordonLinoff -- 奇怪,我想这确实是 SQLFiddle 中的错误或未记录的限制......
-
@LThode 。 . .我认为 SQL Fiddle 很清楚,数据定义和修改代码在左边,查询在右边。
-
@GordonLinoff -- 不是真的,引用他们的about page:“MySQL 只支持从模式中读取的查询(基本上是选择)。这是必要的,因为 MySQL 中的一些限制使得它不可能对我来说,在各种人都在摆弄它时确保架构一致。其他数据库选项允许后端支持的所有查询。“
标签: sql oracle oracle11g ora-00900