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üş
相关产品推荐
相关产品推荐

