首页 > 解决方案 > 使用新 ID 复制数据 - Oracle SQL

问题描述

我有一张桌子:

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

有没有快速的方法?

标签: sqloracle

解决方案


您可以使用递归子查询因式分解子句:

甲骨文设置

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 | 美国广播公司  
     1 | 101 | xyz  
     1 | 102 | 万维网  
     2 | 100 | QQ  
     2 | 101 | rrr  
     2 | 102 | ttt  
   101 | 100 | 美国广播公司  
   101 | 101 | xyz  
   101 | 102 | 万维网  
   102 | 100 | QQ  
   102 | 101 | rrr  
   102 | 102 | ttt  
   201 | 100 | 美国广播公司  
   201 | 101 | xyz  
   201 | 102 | 万维网  
   202 | 100 | QQ  
   202 | 101 | rrr  
   202 | 102 | ttt  
...
  1001 | 100 | 美国广播公司  
  1001 | 101 | xyz  
  1001 | 102 | 万维网  
  1002 | 100 | QQ  
  1002 | 101 | rrr  
  1002 | 102 | ttt  

db<>在这里摆弄


推荐阅读