Я пытаюсь разбить то, что было большим обновлением таблицы, на несколько вставок в рабочие таблицы. Один из запросов должен использовать номер строки в нем. Могу ли я явно добавить ROWNUM
в качестве явного столбца на INSERT в oracle? Это рабочая таблица, которая в конечном итоге используется в операции создания отчетов с неприятным разделением над предложением, и полезно иметь истинный номер строки.
create table MY_TABLE(KEY number,SOMEVAL varchar2(30),EXPLICIT_ROW_NUMBER NUMBER);
INSERT /*+PARALLEL(AUTO) */ INTO MY_TABLE(KEY,SOMEVAL,EXPLICIT_ROW_NUMBER) (
SELECT /*+PARALLEL(AUTO) */ KEY,SOMEVAL,ROWNUM
FROM PREVIOUS_VERSION_OF_MY_TABLE
);
, где PREVIOUS_VERSION_OF_MY_TABLE
имеет поля KEY
и SOMEVAL
.
Я бы хотел, чтобы он пронумеровал строки в том порядке, в котором это делает внутренний оператор выбора. Итак, первая строка в select, если бы она была явно запущена, имела бы ROWNUM, равный 1, et c. Я не хочу, чтобы все было наоборот, и т. Д. c.
В таблице выше более 80 мм записей. Первоначально я использовал ОБНОВЛЕНИЕ, и когда я запустил его, я получил некоторую ошибку ORA, говорящую, что мне не хватило места UNDO. У меня больше нет точного сообщения об ошибке.
Я пытаюсь выполнить sh то же самое с несколькими рабочими таблицами, что я сделал бы с одним или несколькими обновлениями. По-видимому, для этого запроса сложно или невозможно, и т. Д. c добавить пространство UNDO, как говорит команда DB нашей компании, не делая меня администратором баз данных, не тратя около 100 долларов на жесткий диск и не присоединяя его к экземпляру. Поэтому мне нужно написать более сложный запрос, чтобы обойти это ограничение. Цель состоит в том, чтобы иметь идентификатор сеанса и временные метки в этом сеансе, но для каждой временной метки в пределах сеанса (кроме последней временной метки) показывать следующий сеанс. Оригинальный запрос включен ниже:
update sc_hub_session_activity schat
set session_time_stamp_rank = (
select /*+parallel(AUTO) */ order_number
from (
select /*+parallel(AUTO) */ schat_all.explicit_row_number as explicit_row_number,row_number() over (partition by schat_all.session_key order by schat_all.session_key,schat_all.time_stamp) as order_number
from sc_hub_session_activity schat_all
where schat_all.session_key=schat.session_key
) schat_all_group
where schat.explicit_row_number = schat_all_group.explicit_row_number
);
commit;
update sc_hub_session_activity schat
set session_next_time_stamp = (
select /*+parallel(AUTO) */ time_stamp
from sc_hub_session_activity schat2
where (schat2.session_time_stamp_rank = schat.session_time_stamp_rank+1) and (schat2.session_key = schat.session_key)
);
commit;