SQL Server中如何根据RankFrom与RankTo生成连续行结果?
解法:将Rank区间拆分为逐行数据
针对你在SQL Server中的这个需求,我提供三种常用的实现方式,你可以根据自己的SQL Server版本和场景选择:
1. 递归CTE(兼容性最好,支持所有SQL Server版本)
递归CTE是最通用的方法,不需要依赖任何系统表或新特性,思路是先获取原表的每一行,然后递归生成从RankFrom到RankTo的每个数值:
WITH RankCTE AS ( -- 锚点查询:获取原表的初始行,同时把RankFrom转为数值类型 SELECT Code, Name, CAST(RankFrom AS INT) AS CurrentRank, CAST(RankTo AS INT) AS MaxRank FROM Ranking UNION ALL -- 递归查询:每次生成下一个Rank值,直到达到MaxRank SELECT Code, Name, CurrentRank + 1, MaxRank FROM RankCTE WHERE CurrentRank < MaxRank ) SELECT Code, Name, CurrentRank AS Rank FROM RankCTE ORDER BY Code, CurrentRank;
2. 利用系统表生成数字序列(适合不喜欢递归的场景)
SQL Server自带的master.dbo.spt_values表包含了连续的数字,我们可以用它来生成所需的数字范围,再和原表关联:
SELECT r.Code, r.Name, v.number AS Rank FROM Ranking r JOIN master.dbo.spt_values v ON v.number BETWEEN CAST(r.RankFrom AS INT) AND CAST(r.RankTo AS INT) WHERE v.type = 'P' -- 筛选出正整数序列 ORDER BY r.Code, v.number;
注意:
spt_values的number范围默认是0到2047,如果你的Rank区间超过这个范围,需要自己创建一个更大的数字表。
3. SQL Server 2022+ 专属:GENERATE_SERIES函数
如果你的SQL Server版本是2022或更高,直接用GENERATE_SERIES函数可以更简洁地实现:
SELECT r.Code, r.Name, s.value AS Rank FROM Ranking r CROSS APPLY GENERATE_SERIES(CAST(r.RankFrom AS INT), CAST(r.RankTo AS INT)) s ORDER BY r.Code, s.value;
测试结果
针对你插入的测试数据:
INSERT INTO [Ranking]([Code],[Name],[RankFrom],[RankTo])VALUES('01','Hisanth','105','110')
以上三种方法都会返回6行结果:
| Code | Name | Rank |
|---|---|---|
| 01 | Hisanth | 105 |
| 01 | Hisanth | 106 |
| 01 | Hisanth | 107 |
| 01 | Hisanth | 108 |
| 01 | Hisanth | 109 |
| 01 | Hisanth | 110 |
内容的提问来源于stack exchange,提问作者Hisanth
相关产品推荐
相关产品推荐

