【问题标题】:ORA-00900 on delete statement删除语句上的 ORA-00900
【发布时间】:2015-05-29 18:29:20
【问题描述】:

我正在尝试将 DELETE FROMIN 子句和子查询一起使用,以删除另一个表上的查询给出的行,该表与我要从中删除的表是一对一的,但是 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


【解决方案1】:

也许你需要一个左连接与左连接通过反转表并只取空值

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 

【讨论】:

    【解决方案2】:

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

    为什么关于页面没有更清楚地记录这一点,我不知道......

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 2011-07-17
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2011-01-21
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多