Явно установить ROWNUM в столбце - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь разбить то, что было большим обновлением таблицы, на несколько вставок в рабочие таблицы. Один из запросов должен использовать номер строки в нем. Могу ли я явно добавить 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...