我正在尝试将DELETE FROM
与IN
子句和子查询一起使用来删除查询给出的行,该表在另一个表上与我要删除的表一对一,但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}}。
答案 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不会更清楚地记录,我不知道...