SQL如何根据Qty字段值输出对应数量的Part重复记录
SQL按Qty字段生成对应重复记录的实现方案
核心思路是构造连续数字序列,将数字序列和原零件表关联,关联条件为数字值小于等于对应记录的Qty值,即可生成对应数目的重复行。
方案1:通用递归CTE方案(兼容所有支持递归CTE的主流数据库:MySQL 8.0+ / PostgreSQL / SQL Server / Oracle 11g+)
无需额外建表,适配大多数场景,示例代码如下(假设原表名为part_qty):
-- 构造从1到最大Qty值的连续数字序列 WITH RECURSIVE num_sequence(n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM num_sequence WHERE n < (SELECT MAX(Qty) FROM part_qty) ) -- 关联原表生成重复记录 SELECT p.Part, p.Qty FROM part_qty p INNER JOIN num_sequence ns ON ns.n <= p.Qty;
注意事项:
- 如果你的Qty最大值超过数据库默认递归深度,需手动调整参数:MySQL执行
SET @@cte_max_recursion_depth = 1000;,SQL Server在语句末尾加OPTION (MAXRECURSION 1000)
方案2:PostgreSQL专属高效方案
PostgreSQL内置generate_series函数可以直接生成指定范围的连续值,语法更简洁,性能优于递归方案:
SELECT p.Part, p.Qty FROM part_qty p, generate_series(1, p.Qty);
方案3:全版本兼容方案(适配不支持CTE的低版本数据库,比如MySQL 5.x)
提前创建一个数字辅助表nums,存储1到超过你业务最大Qty值的连续整数,一次创建可永久使用:
-- 建辅助表 CREATE TABLE nums (n INT PRIMARY KEY); -- 插入足够多的连续数字,示例插入到1000,可根据业务需要调整 INSERT INTO nums(n) VALUES (1),(2),(3),...,(1000);
关联查询逻辑:
SELECT p.Part, p.Qty FROM part_qty p INNER JOIN nums n ON n.n <= p.Qty;
该方案性能最优,适合数据量较大的生产场景。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

