基于NumberofApplication列数据动态生成新记录的SQL查询需求
实现需求的SQL修改方案
方法1:递归CTE生成对应记录
通过递归公共表表达式(CTE)为每条原记录生成指定数量的ApplicationID序列:
WITH AppSeq AS ( -- 初始化:取原表数据,ApplicationID从1开始 SELECT ResponseID, Variety, Product, MixID, 1 AS ApplicationID, NumberOfApplications FROM #pattmp WHERE ResponseID = 'mnmbaf' UNION ALL -- 递归生成后续ID,直到达到NumberOfApplications的值 SELECT ResponseID, Variety, Product, MixID, ApplicationID + 1, NumberOfApplications FROM AppSeq WHERE ApplicationID < NumberOfApplications ) SELECT ResponseID, Variety, Product, MixID, ApplicationID, NumberOfApplications FROM AppSeq ORDER BY Product, ApplicationID;
方法2:利用系统表生成数字序列(SQL Server适用)
如果使用SQL Server,可以借助系统表master..spt_values快速生成数字范围,避免递归:
SELECT p.ResponseID, p.Variety, p.Product, p.MixID, v.number AS ApplicationID, p.NumberOfApplications FROM #pattmp p INNER JOIN master..spt_values v ON v.type = 'P' AND v.number BETWEEN 1 AND p.NumberOfApplications WHERE p.ResponseID = 'mnmbaf' ORDER BY p.Product, v.number;
关键说明
- 两种方案都会将原表中每条记录扩展为
NumberOfApplications条新记录,ApplicationID自动填充为1到对应数值(比如原表值为3时,每条原记录生成3条新记录)。 - 递归CTE兼容性更好,适合所有支持CTE的SQL数据库;系统表方法在处理较大数值时性能更优,但仅适用于SQL Server。
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

