2013-07-25 3 views
1

я должен удалить данные из определенной таблицы, поэтому я использую следующий запрос:Удаления запроса путем объединения двух таблиц в экономически эффективном способе

delete from table_a 
where objectname in 
    (Select object_name from table_b where resolved='Y'); 

Теперь Select object_name from table_b where resolved='Y' запроса будет возвращать более 4 миллионов записей и, следовательно, потребуется много времени для выполнения. Я пытаюсь написать его более экономичным способом.

DELETE FROM table_a 
WHERE EXISTS (SELECT 1 FROM table_b WHERE object_name= objectname AND RESOLVED = ‘Y’) 
AND ROWNUM < 10000; 

Но, кажется, ошибка:

SQL Error: ORA-00911: invalid character 00911. 00000 - "invalid character" *Cause: identifiers may not start with any ASCII character other than letters and numbers. $#_ are also allowed after the first character. Identifiers enclosed by doublequotes may contain any character other than a doublequote. Alternative quotes (q'#...#') cannot use spaces, tabs, or carriage returns as delimiters. For all other contexts, consult the SQL Language Reference Manual.

Пожалуйста, помогите!

+0

* «кажется, ошибка» * Какая ошибка у вас есть? –

+0

Ошибка SQL: ORA-00911: недопустимый символ 00911. 00000 - «недопустимый символ» * Причина: идентификаторы могут не начинаться с любого символа ASCII, кроме букв и цифр. $ # _ также допускаются после первого символа . Идентификаторы, заключенные двойными кавычками, могут содержать любой символ, отличный от двойного. Альтернативные котировки (q '# ... #') не могут использовать пробелы, табуляции или возврат каретки как разделители . Для всех других контекстов обратитесь к Справочнику по языку SQL . – Ankit

+2

Возможно, из-за смешных цитат: '' Y''. Попробуйте использовать '' Y'', как в первом примере. –

ответ

0

Если у вас есть

  • первичный ключ TABLE_A
  • внешнего ключа на TABLE_B, который ссылается на TABLE_A и установлен в положение ON DELETE CASCADE или ON DELETE SET NULL

вы можете используйте встроенное представление для этого:

create table table_a as (select distinct object_name from all_objects); 
alter table table_a add constraint pk_a primary key (object_name); 

create table table_b as (
    select 
    distinct object_name, 
    (case when object_name like 'A%' then 'Y' else 'N' end) as resolved 
    from table_a);  
alter table table_b add constraint fk_b_a foreign key (object_name) 
    references table_a(object_name) on delete cascade; 

delete from (
    select b.resolved 
    from table_a a 
    join table_b b on a.object_name = b.object_name) 
where resolved = 'Y'; 

, но, честно говоря, EXISTS/IN a pproach намного чище и понятнее.

+0

УДАЛИТЬ ИЗ ТАБЛИЦЫ A ГДЕ СУЩЕСТВУЕТ (ВЫБОР object_name FROM table B WHERE object_name = имя_имя И RESOLVED = 'Y') И ROWNUM <10000; Мне нужно удалить более 4 миллионов записей в таблице A, поэтому каждый раз, когда я запускаю этот запрос, он ограничивает мой результирующий набор удалением 10K записей. Это верно? – Ankit

Смежные вопросы