使用新ID复制数据-Oracle SQL
我有一张桌子:使用新ID复制数据-Oracle SQL,sql,oracle,Sql,Oracle,我有一张桌子: u_a_id c_id c_val 1 100 abc 1 101 xyz 1 102 www 2 100 qqq 2 101 rrr 2 102 ttt 我有100个这样的u_a_id。我需要复制相同的内容,但通过将u_a_id增加100,10倍,使总记录变为1000 因此,输出将是: u_a_id c_id c_val 1
u_a_id c_id c_val
1 100 abc
1 101 xyz
1 102 www
2 100 qqq
2 101 rrr
2 102 ttt
我有100个这样的u_a_id。我需要复制相同的内容,但通过将u_a_id增加100,10倍,使总记录变为1000
因此,输出将是:
u_a_id c_id c_val
1 100 abc
1 101 xyz
1 102 www
2 100 qqq
2 101 rrr
2 102 ttt
101 100 abc
101 101 xyz
101 102 www
102 100 qqq
102 101 rrr
102 102 ttt
有没有一种快速的方法呢?在一个选择中,您可以做:
select u_a_id, c_id, c_val
from t
union all
select u_a_id + 100, c_id, c_val
from t
where u_a_id in ( . . . ) -- your list here
或在表中插入行:
insert into t (u_a_id, c_id, c_val)
select u_a_id + 100, c_id, c_val
from t
where u_a_id in ( . . . ); -- your list here
我假设您希望您的数据集的u_a_id=1扩展到101201,直到901 使用WITH子句生成9个数字,这些数字乘以100。将其与原始表交叉连接以获得增加的集合:
insert into your_table
with cte as (
select level * 100 as val
from dual
connect by level <= 9 )
select t.u_a_id + cte.val
, t.c_id
, t.c_val
from your_table t
cross join cte
大概是这样的:
INSERT INTO table
SELECT u_a_id +100 AS u_a_id, c_id, c_val
FROM table
WHERE u_a_id BETWEEN 1 AND 100
运行后,使用+200、+300等重新运行,而不是使用+100…您可以使用递归子查询分解子句: Oracle安装程序: 插入: 小提琴
CREATE TABLE table_name ( u_a_id, c_id, c_val ) AS
SELECT 1, 100, 'abc' FROM DUAL UNION ALL
SELECT 1, 101, 'xyz' FROM DUAL UNION ALL
SELECT 1, 102, 'www' FROM DUAL UNION ALL
SELECT 2, 100, 'qqq' FROM DUAL UNION ALL
SELECT 2, 101, 'rrr' FROM DUAL UNION ALL
SELECT 2, 102, 'ttt' FROM DUAL
INSERT INTO table_name ( u_a_id, c_id, c_val )
WITH rsqfc ( u_a_id, c_id, c_val ) AS (
SELECT u_a_id + 100, c_id, c_val
FROM table_name
UNION ALL
SELECT u_a_id + 100, c_id, c_val
FROM rsqfc
WHERE u_a_id < 1000
)
SELECT u_a_id, c_id, c_val
FROM rsqfc
SELECT * FROM table_name
U_A_ID | C_ID | C_VAL
-----: | ---: | :----
1 | 100 | abc
1 | 101 | xyz
1 | 102 | www
2 | 100 | qqq
2 | 101 | rrr
2 | 102 | ttt
101 | 100 | abc
101 | 101 | xyz
101 | 102 | www
102 | 100 | qqq
102 | 101 | rrr
102 | 102 | ttt
201 | 100 | abc
201 | 101 | xyz
201 | 102 | www
202 | 100 | qqq
202 | 101 | rrr
202 | 102 | ttt
...
1001 | 100 | abc
1001 | 101 | xyz
1001 | 102 | www
1002 | 100 | qqq
1002 | 101 | rrr
1002 | 102 | ttt