Генерация дополнительных числовых значений столбца во время инструкции INSERT SELECT - PullRequest
7 голосов
/ 03 мая 2010

Мне нужно скопировать некоторые данные из одной таблицы в другую в 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?

Пожалуйста, сочтите, что триггер не вариант.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я хотел бы контролировать порядок вставки новых строк, и порядок их создания в старой таблице будет отличаться (обратите внимание, что я добавил ЗАКАЗ BY пункт выше). Но я все еще хочу, чтобы мой новый последовательный столбец начинался с 1.

Есть похожие вопросы, но я считаю, что особенности моего вопроса являются оригинальными для SO.

Ответы [ 2 ]

10 голосов
/ 03 мая 2010

Вы можете использовать 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
    );
0 голосов
/ 03 мая 2010

Почему бы вам не определить столбец new_col как primary_key или unique и пометить его как автоинкремент? Таким образом, каждая вставка получит следующий более высокий «счет».

Я не очень знаком с оракулом, но держу пари, что есть встроенная функция автоинкремента.

...