我需要在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开始。
有类似的问题,但我相信我的问题的细节是原创的。
答案 0 :(得分:10)
您可以使用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
);
答案 1 :(得分:-1)
为什么不将new_col列定义为primary_key或unique并将其标记为autoincrement? 这样每个插入将获得下一个更高的“计数”。
我对oracle并不熟悉,但我敢打赌它内置了自动增量功能。