删除声明中的ORA-00900

时间:2015-03-25 21:12:21

标签: sql oracle oracle11g ora-00900

我正在尝试将DELETE FROMIN子句和子查询一起使用来删除查询给出的行,该表在另一个表上与我要删除的表一对一,但Oracle 11g2向我发出一个完全没有用的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的来源。)

P.S。这个语句也是有效的SQL - SQL Server 2014和PostgreSQL 9.3都没有小提琴的问题,并且一旦full outer join切换为{inner join,它就可以在SQLite 3.8.8.3的本地副本中工作。 1}}。

2 个答案:

答案 0 :(得分:0)

也许您需要通过反转表并且仅采用空值

来与左连接结合使用左连接
select * from obj left join meta on obj.id = meta.id 
union all
select * from meta left join obj  on obj.id = meta.id 
where obj.id is null 

答案 1 :(得分:0)

这确实是SQLFiddle中的一个问题 - 当我对我正在使用的实际数据库运行这种形式的delete语句时,ORA-00900不会发生。

为什么about page不会更清楚地记录,我不知道...