You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SQL表所有行复制5次并同步递增Portfolio_num与Sim_num列值?

SQL实现表行复制并递增指定列

需求

现有test表,初始数据如下:

Portfolio_numSim_numSECIDFV
00TB2023042134000
00TB2023052138000
00TB2023062140000

需要把所有行复制5次,每次复制时Portfolio_num和Sim_num同步加1(最终得到0到5共6组数据),SECID和FV保持不变。

原表的创建和初始化语句:

CREATE TABLE test (
    Portfolio_num int,
    Sim_num int,
    SECID varchar(10),
    FV int
);

INSERT INTO test (Portfolio_num, Sim_num, SECID, FV)
VALUES
(0,0, 'TB20230421', 34000),
(0,0, 'TB20230521', 38000),
(0,0, 'TB20230621', 40000);

实现方案

方案1:递归CTE(支持CTE的数据库:MySQL 8+、PostgreSQL、SQL Server等)

递归生成0到5的数字序列,和原表做笛卡尔积计算新的列值:

WITH RECURSIVE nums(n) AS (
    SELECT 0
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 5
)
SELECT 
    t.Portfolio_num + n AS Portfolio_num,
    t.Sim_num + n AS Sim_num,
    t.SECID,
    t.FV
FROM test t
CROSS JOIN nums
ORDER BY Portfolio_num, SECID;

如果要把新增数据插入原表(原表已有0组数据,所以从1开始生成序列):

WITH RECURSIVE nums(n) AS (
    SELECT 1
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 5
)
INSERT INTO test (Portfolio_num, Sim_num, SECID, FV)
SELECT 
    t.Portfolio_num + n,
    t.Sim_num + n,
    t.SECID,
    t.FV
FROM test t
CROSS JOIN nums;

方案2:手动生成数字序列(兼容低版本数据库:MySQL 5.x等)

直接用UNION ALL构造需要的数字序列,再和原表关联:

SELECT 
    t.Portfolio_num + nums.n AS Portfolio_num,
    t.Sim_num + nums.n AS Sim_num,
    t.SECID,
    t.FV
FROM test t
CROSS JOIN (
    SELECT 0 AS n UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5
) nums
ORDER BY Portfolio_num, SECID;

插入版本:

INSERT INTO test (Portfolio_num, Sim_num, SECID, FV)
SELECT 
    t.Portfolio_num + nums.n,
    t.Sim_num + nums.n,
    t.SECID,
    t.FV
FROM test t
CROSS JOIN (
    SELECT 1 AS n UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5
) nums;

内容的提问来源于stack exchange,提问作者Renegade_rm56

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:45:25