2015-12-09 3 views
0

У меня есть таблица без pk, и мне нужно обновить импорт определенной записи с суммой импорта других из той же таблицы с некоторыми условиями.Обновить значение таблицы из той же таблицы

попытайтесь объяснить немного лучше.

У меня есть таблица X, с идентификаторами столбцов и IMP (это импорт, который мне нужно обновить). Так что я пытаюсь обновить значение IMP записи с ID = 5 с суммой других ИМПОРТ, где записи идентификаторов < 5.

UPDATE X old 
SET old.IMP = 
    (SELECT SUM(new.IMP) 
    FROM X new 
    WHERE new.ID<5) 
WHERE old.ID = 5; 

но он принимает возрастов, чтобы обновить. Я даже не знаю, закончится ли это, потому что это заняло слишком много, и я alastasy прервал скрипт.

Я делаю что-то неправильно?

EDIT

Да. Вы спросили меня о правильной ситуации. Работа на столе очень маленькая, около 2000 записей. Конечно, нет индексов. Я до сих пор не знаю, почему так много. Если я просто запустил скрипт, чтобы получить SUM, потребуется несколько мс, но с обновлением он, похоже, застрял в чем-то, чего я не понимаю.

EDIT 2

Первое правило компьютеров: перезагрузка. И так все снова возвращается к работе. Не знаю, что происходит, но просто перезагрузите компьютер, и теперь скрипт работает правильно. Извините за любые проблемы.

+1

Насколько велика таблица? Сколько строк, какие индексы и какой план объяснения. Я подозреваю, что ваш стол на самом деле не называется X, и вы, возможно, упрощаете ситуацию. –

+0

Сколько данных вы пытаетесь обработать? Даже с соответствующими индексами (которые, как вы сказали, у вас их нет), обновление большого количества данных за один раз может быть напряженным для сегмента отмены, а также журналов предупреждений. Можете ли вы подготовить вторую таблицу со значениями SUM для каждого идентификатора, который будет обновляться. А затем в цикле обновите его в меньших партиях. Обновление большого количества данных также может привести к эскалации блокировки таблицы, что означает, что вы можете быть в этом и даже не делать ничего. –

+0

Отредактировано ситуацией, в которой я работаю –

ответ

0

Выполнить эти запросы и разделить вывод:

select sum(bytes)/1024/1024 from dba_segments where segment_name = 'X'; 

select owner, index_name, column_name from dba_ind_columns where table_name = 'X'; 

select count(1) from X; 

Если у вас есть доступ к OEM, вы можете отслеживать заявление SQL, чтобы увидеть, если есть прогресс или блокаторы по запросу.

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