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

SQL中基于数量列生成对应序列号并拆分多行的方法咨询

实现方案

支持递归CTE的数据库(MySQL 8.0+、SQL Server 2008+、Oracle 11gR2+、PostgreSQL 10+)

使用递归公共表表达式生成覆盖最大Qty值的连续序列号,再和原表关联完成行拆分:

WITH RECURSIVE SerialGenerator AS (
    SELECT 1 AS SerialNo
    UNION ALL
    SELECT SerialNo + 1 FROM SerialGenerator WHERE SerialNo < (SELECT MAX(Qty) FROM T1)
)
SELECT 
    t.Order_no AS OrderNo,
    t.Qty,
    s.SerialNo
FROM T1 t
JOIN SerialGenerator s ON s.SerialNo <= t.Qty
ORDER BY t.Order_no, s.SerialNo;

如果Qty最大值超过数据库默认递归层数限制(比如MySQL默认1000),可以提前执行SET @@cte_max_recursion_depth = 10000;调整递归上限。

不支持递归CTE的旧版本数据库

可以手动构造临时数字序列关联,或者提前维护一张存储连续整数的专用辅助表关联:

SELECT 
    t.Order_no AS OrderNo,
    t.Qty,
    s.SerialNo
FROM T1 t
JOIN (
    SELECT 1 AS SerialNo UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
    SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
    -- 补充更多数字,直到覆盖你表中最大的Qty值即可
    SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
) s ON s.SerialNo <= t.Qty
ORDER BY t.Order_no, s.SerialNo;

PostgreSQL专属简化写法

PostgreSQL内置序列生成函数,无需额外构造序列:

SELECT 
    Order_no AS OrderNo,
    Qty,
    generate_series(1, Qty) AS SerialNo
FROM T1
ORDER BY Order_no, SerialNo;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:04