oracle 如何将一个表中的所有数据复制到同一个表中,但只将一列更改为具有后续数字

nfg76nw0  于 2023-02-03  发布在  Oracle
关注(0)|答案(3)|浏览(182)

我不得不做以下几件事,但我不知道如何正确地完成这些事:
我有个桌上考试
| 试验1|测试2|
| - ------|- ------|
| 1个|美国广播公司|
| 第二章|DEF|
我想复制这个,并让test1列有后续的编号,当我做一个简单的插入,我当然可以复制它,我有我需要的,但我不能得到Test1的正确编号。
我想要的结果是这样的:
| 试验1|测试2|
| - ------|- ------|
| 1个|美国广播公司|
| 第二章|DEF|
| 三个|美国广播公司|
| 四个|DEF|
我现在得到的是:
| 试验1|测试2|
| - ------|- ------|
| 1个|美国广播公司|
| 第二章|DEF|
| 1个|美国广播公司|
| 第二章|DEF|
我尝试了以下方法,但没有在test1列中获得后续编号:

INSERT INTO test (test1,
test2) 

SELECT test,
test

FROM test; drop table if exists temp.tmp; 
create temporary table tmp as
select test1, row_number() over (order by test1) rn
from test; update test
set test1 = (
  select rn from temp.tmp
  where temp.tmp.test1 = test.test1
  );
  drop table temp.tmp;
ozxc1zmp

ozxc1zmp1#

您可以使用窗口函数来完成此任务。具体来说,您可以复制所有行,但通过将当前记录总数添加到表中的每条记录来增加Test1的值。

INSERT INTO tab
SELECT Test1 + COUNT(*) OVER(), Test2 FROM tab;

输出:
| 试验1|测试2|
| - ------|- ------|
| 1个|美国广播公司|
| 第二章|DEF|
| 三个|美国广播公司|
| 四个|DEF|
检查here演示。

vs91vp4v

vs91vp4v2#

这个怎么样?
样本数据:

SQL> select * from test;

     TEST1 TES
---------- ---
         1 ABC
         2 DEF
         5 GHI

test2列中插入重复项:

SQL> insert into test (test2) select test2 from test;

3 rows created.

修复编号:

SQL> update test set test1 = rownum;

6 rows updated.

结果:

SQL> select * from test;

     TEST1 TES
---------- ---
         1 ABC
         2 DEF
         3 GHI
         4 ABC
         5 DEF
         6 GHI

6 rows selected.

SQL>
o4tp2gmn

o4tp2gmn3#

我认为创建一个包含IDENTITY列的相同表是很简单的,前提是DB的版本是12c+,例如

CREATE TABLE Test_( Test1 INT GENERATED ALWAYS AS IDENTITY, Test2 VARCHAR2(99) );

INSERT INTO Test_(Test2) SELECT Test2 FROM Test ORDER BY Test1; -- run as many times as you wish

DROP TABLE Test;

ALTER TABLE Test_ RENAME TO Test;

SELECT * FROM Test; -- assuming the INSERT Statement above run twice

TEST1 | TEST2
------|-------
1     |  ABC
2     |  DEF
3     |  ABC
4     |  DEF

Demo

相关问题