如何在同一条SQL查询中为每个SLC_ID批量补全指定数量的空行
解决方案
你现有SQL的问题是内层子查询无法直接引用外层关联的SLC_ID,也没有预先给每个SLC_ID生成完整的10行序列框架,导致只有第一个SLC_ID能正常补全。
可以按以下逻辑调整SQL:
- 先提取所有唯一的SLC_ID,和1-10的数字表做笛卡尔积,强制每个SLC_ID都生成10行基础结构
- 给原业务表中每个SLC_ID下的PCE_ID单独分组编行号,避免不同SLC_ID的行号冲突
- 把基础结构和编好行号的业务数据做左关联,匹配不到的PCE_ID自动为NULL
调整后的SQL如下:
WITH NUMBERS AS ( SELECT 1 rowNumber 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 SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 ), -- 提取所有唯一的SLC_ID UNIQUE_SLC AS ( SELECT DISTINCT SLC_ID FROM SELECT_PART ), -- 给每个SLC_ID下的PCE_ID单独排序编行号 PART_RANKED AS ( SELECT SLC_ID, PCE_ID, ROW_NUMBER() OVER (PARTITION BY SLC_ID ORDER BY PCE_ID) AS rowNumber FROM SELECT_PART ) SELECT us.SLC_ID, n.rowNumber, pr.PCE_ID FROM UNIQUE_SLC us -- 笛卡尔积生成每个SLC_ID对应的10行框架 CROSS JOIN NUMBERS n LEFT JOIN PART_RANKED pr ON us.SLC_ID = pr.SLC_ID AND n.rowNumber = pr.rowNumber ORDER BY us.SLC_ID, n.rowNumber
该写法可以保证每个SLC_ID都固定输出10行,有对应PCE_ID的正常返回值,没有的返回NULL,完全符合你需要的报表输出格式。
内容的提问来源于stack exchange,提问作者Eric Brochu
相关产品推荐
相关产品推荐

