Генерация инкрементных числовых значений столбцов во время инструкции INSERT SELECT
Мне нужно скопировать некоторые данные из одной таблицы в другую в 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;
есть ли способ сделать это без создания последовательности или любого другого временный объект? в частности, можно ли это сделать с помощью автономной инструкции INSERT SELECT?
пожалуйста, рассмотрите триггер как не вариант.
ПОДРОБНЕЕ: Я хотел бы контролировать порядок вставки новых строк, и это не будет тот же порядок, в котором они были созданы в старой таблице (обратите внимание, что я добавил предложение ORDER BY выше). Но я все еще хочу, чтобы мой новый последовательный столбец начинался с 1.
есть похожие вопросы, но я считаю, что специфика моего вопроса оригинальна для SO.
2 ответов
можно использовать 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, но я бы поспорил, что есть встроенная функция автоинкремента.