如何根据Quantity字段值重复数据表中的行?
如何根据商品数量重复输出对应记录?
这个需求核心就是要根据每行的QUANTITY值,把对应的商品记录重复输出对应次数对吧?我给你整理了几种常用数据库的实现方案,都是实际项目里常用的写法:
MySQL 8.0+ 实现方案
MySQL 8.0及以上版本支持递归CTE(公共表表达式),可以用它生成数字序列再和原表关联:
WITH RECURSIVE num_seq AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM num_seq WHERE n < (SELECT MAX(QUANTITY) FROM your_table) ) SELECT t.ID, t.PRODUCT_NAME FROM your_table t JOIN num_seq s ON s.n <= t.QUANTITY -- 如果只需要数量≤6的商品,加上下面的过滤条件 WHERE t.QUANTITY <= 6 ORDER BY t.ID, s.n;
思路说明:
- 先用递归CTE生成从1到表中最大库存数的数字序列;
- 将原表和数字序列关联,只保留数字小于等于当前行库存数的记录,这样每条商品就会被重复
QUANTITY次; - 最后通过WHERE条件过滤出数量≤6的商品,排序保证结果和你示例一致。
PostgreSQL 实现方案
PostgreSQL有内置的generate_series函数,实现起来更简洁:
SELECT t.ID, t.PRODUCT_NAME FROM your_table t JOIN generate_series(1, t.QUANTITY) s WHERE t.QUANTITY <= 6 ORDER BY t.ID;
思路说明:
generate_series(1, t.QUANTITY)会为每行商品自动生成从1到该行库存数的数字序列,直接关联后就完成了记录的重复,非常直观高效。
SQL Server 实现方案
SQL Server同样支持递归CTE,写法和MySQL类似,注意递归次数限制即可:
WITH num_seq AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM num_seq WHERE n < (SELECT MAX(QUANTITY) FROM your_table) ) SELECT t.ID, t.PRODUCT_NAME FROM your_table t INNER JOIN num_seq s ON s.n <= t.QUANTITY WHERE t.QUANTITY <= 6 ORDER BY t.ID, s.n OPTION (MAXRECURSION 0); -- 解除默认递归次数限制,避免库存数过大时报错
注意点:
SQL Server默认递归次数上限是100,如果你的商品最大库存超过100,必须加上OPTION (MAXRECURSION 0)来解除限制。
低版本MySQL(无CTE支持)实现方案
如果是MySQL 5.7及以下不支持CTE的版本,可以用临时数字表来实现:
-- 先创建临时数字表,按需插入足够多的数字 CREATE TEMPORARY TABLE nums (n INT); INSERT INTO nums VALUES (1),(2),(3),(4),(5),(6); SELECT t.ID, t.PRODUCT_NAME FROM your_table t JOIN nums s ON s.n <= t.QUANTITY WHERE t.QUANTITY <= 6 ORDER BY t.ID, s.n;
这种方法适合版本较低的环境,缺点是需要预先预估最大的库存数字范围。
内容的提问来源于stack exchange,提问作者Ladis
相关产品推荐
相关产品推荐

