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

SQL中如何根据表内数据重复输出对应行?

实现SQL中按字段值重复行的方法

不同数据库的实现方式略有差异,以下是几种主流数据库的解决方案:

MySQL

方法1:递归CTE(MySQL 8.0及以上版本)

通过递归生成覆盖最大AMOUNT值的数字序列,再和原表关联:

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < (SELECT MAX(AMOUNT) FROM your_table)
)
SELECT t.*
FROM your_table t
JOIN nums n ON n.n <= t.AMOUNT
ORDER BY t.id; -- id替换成你的表主键或排序字段

方法2:数字表关联(兼容MySQL 5.x)

如果你的MySQL版本不支持CTE,可以用多表联合生成足够多的数字行:

SELECT t.*
FROM your_table t
JOIN (
    SELECT @row := @row + 1 AS n FROM 
    (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) a,
    (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) b,
    (SELECT @row := 0) c
) nums ON nums.n <= t.AMOUNT
ORDER BY t.id;

上面的a和b联合可以生成25行数字,若AMOUNT最大值更大,可继续添加类似的(SELECT 1 UNION ALL ...)表。

PostgreSQL

PostgreSQL自带的generate_series函数可以直接生成对应范围的序列,写法最简洁:

SELECT t.*
FROM your_table t
JOIN generate_series(1, t.AMOUNT) s ON true
ORDER BY t.id;

SQL Server

方法1:递归CTE

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < (SELECT MAX(AMOUNT) FROM your_table)
)
SELECT t.*
FROM your_table t
JOIN nums n ON n.n <= t.AMOUNT
ORDER BY t.id
OPTION (MAXRECURSION 0); -- 若AMOUNT最大值超过100,必须添加此选项解除递归限制

方法2:STRING_SPLIT+REPLICATE(适合AMOUNT值较小的场景)

SELECT t.*
FROM your_table t
CROSS APPLY STRING_SPLIT(REPLICATE(',', t.AMOUNT - 1), ',')
ORDER BY t.id;

核心逻辑都是:生成从1到目标字段值的数字序列,将原表与序列关联,每个数字对应一行原表数据,从而实现重复输出。

内容的提问来源于stack exchange,提问作者Muhammed Güngörmüş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:00:59