如何使用普通SQL遍历查询结果 按CountRollIDs重复行并生成递增RollID
普通SQL可以实现该需求,主流数据库通用的方案是使用递归公共表表达式(递归CTE),无需额外的存储过程或自定义函数,适配MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数主流数据库环境。
假设你查询的原始表名为your_table,可直接使用如下SQL实现需求:
WITH RECURSIVE generate_rolls AS ( -- 锚点成员:读取原始行作为第一行结果 SELECT RollID, ItemCode, Quantity, DocNum, CountRollIDs, 1 AS current_seq FROM your_table -- 此处可填写你原查询的过滤条件,锁定需要展开的行 UNION ALL -- 递归成员:逐行生成递增的RollID,直到达到CountRollIDs指定的次数 SELECT RollID + 1, ItemCode, Quantity, DocNum, CountRollIDs, current_seq + 1 FROM generate_rolls WHERE current_seq < CountRollIDs ) -- 输出最终结果,剔除辅助计算用的current_seq字段 SELECT RollID, ItemCode, Quantity, DocNum, CountRollIDs FROM generate_rolls;
上述代码执行后会自动将原始行按CountRollIDs的数值展开为对应行数,RollID从初始值开始逐行+1递增,完全匹配需求。
如果你的数据库版本较低不支持递归CTE(比如MySQL 5.x),可以提前创建一张存储连续数字的辅助表numbers(表内仅含字段n,存储1、2、3……的连续值,最大值大于业务中可能出现的最大CountRollIDs即可),使用关联查询实现:
SELECT t.RollID + n.n - 1 AS RollID, t.ItemCode, t.Quantity, t.DocNum, t.CountRollIDs FROM your_table t INNER JOIN numbers n ON n.n <= t.CountRollIDs -- 此处填写原查询的过滤条件
内容的提问来源于stack exchange,提问作者bastian
相关产品推荐
相关产品推荐

