ORA-00900 при удалении заявления
Я пытаюсь использовать DELETE FROM
с IN
предложение и подзапрос, чтобы удалить строки, заданные запросом в другой таблице, являющейся 1-к-1 с таблицей, из которой я удаляю, но Oracle 11g2 исключает совершенно бесполезную ошибку ORA-00900, как в следующей скрипте SQL:
Для тех, кто не может получить доступ к 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;
(The select ... full outer join
запускается сам по себе, и ошибка все равно возникает, если я все равно закомментирую ее, поэтому это не источник ORA-00900.)
PS Это утверждение также допустимо для SQL - ни SQL Server 2014, ни PostgreSQL 9.3 не имеют проблем с скрипкой, и он работает и в локальной копии SQLite 3.8.8.3, как только full outer join
переключается на inner join
,
2 ответа
Это действительно проблема в SQLFiddle - ORA-00900 не возникает, когда я запускаю эту форму оператора удаления для фактической базы данных, с которой я работаю.
Почему страница "о" не документирует это более четко, я не знаю...
Может быть, вам нужно левое объединение в объединение с левым объединением путем обращения таблицы и принятия только нулевых значений
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