使用新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