Я должен скопировать некоторые данные от одной таблицы до другого в Oracle при генерации возрастающие значения для числового столбца в новой таблице. Это - разовое осуществление с тривиальным количеством строк (100).
У меня есть верное решение этой проблемы, но мне любопытно знать, существует ли более изящный путь.
Я делаю его с временной последовательностью, как так:
CREATE SEQUENCE temp_seq
START WITH 1;
INSERT INTO new_table (new_col, copied_col1, copied_col2)
SELECT temp_seq.NEXTVAL, o.*
FROM (SELECT old_col1, old_col2
FROM old_table,
ORDER BY old_col1) o;
DROP SEQUENCE temp_seq;
Там путь состоит в том, чтобы сделать с, не создавая последовательность или какой-либо другой временный объект? А именно, это может быть сделано с автономным оператором SELECT ВСТАВКИ?
Полагайте, что триггер неопция.
Подробнее: Я хотел бы управлять порядком, что новые строки вставляются, и это не будет тот же порядок, они были созданы в старой таблице (обратите внимание, что я добавил пункт ORDER BY выше). Но я все еще хочу, чтобы мой новый последовательный столбец запустился от 1.
Существуют подобные вопросы, но я полагаю, что специфические особенности моего вопроса являются исходными к ТАК.
Вы можете использовать ROWNUM
. Этот псевдостолбец нумерует строки в вашем результате:
Insert Into new_table (new_col, copied_col1, copied_col2)
Select Rownum, old_col1, old_col2
From old_table;
Если вы хотите, чтобы ваши записи были отсортированы, вам нужно использовать подзапрос:
Insert Into new_table (new_col, copied_col1, copied_col2)
Select Rownum, old_col1, old_col2
From (
Select old_col1, old_col2
From old_table
Order By old_col1
);
Почему бы вам не определить столбец new_col как primary_key или unique и не пометить его как автоинкремент? Таким образом, каждая вставка получит следующий высший "счет".
Я не очень хорошо знаком с Oracle, но готов поспорить, что в нем есть встроенная функция автоинкремента.