如何拆分非常规表结构记录并复制对应批次数据?
解决方案:用SQL拆分并复制批次数据
这表结构确实有点反常规,但咱们可以通过CTE(公共表表达式)加关联查询的方式实现你要的结果。下面是针对你的需求写的SQL代码,兼容大多数现代关系型数据库(比如SQL Server、MySQL 8.0+、PostgreSQL等):
WITH ItemBatch AS ( -- 提取所有ItemID记录,记录每个Item所属的批次和SN号 SELECT BatchId, Details AS ItemSN, Heading, Details, Issue1, Issue2, Issue3, Comments FROM OddTable WHERE Heading = 'ItemID' ), BatchMetadata AS ( -- 提取每个批次的公共元数据(非ItemID的行) SELECT BatchId, Heading, Details, Issue1, Issue2, Issue3, Comments FROM OddTable WHERE Heading != 'ItemID' ) -- 合并Item记录和对应的批次元数据,并按要求排序 SELECT Heading, Details, Issue1, Issue2, Issue3, Comments FROM ( -- 第一部分:保留原始的ItemID行 SELECT ItemSN, Heading, Details, Issue1, Issue2, Issue3, Comments, 1 AS SortOrder -- 让ItemID行排在最前面 FROM ItemBatch UNION ALL -- 第二部分:把每个批次的元数据和该批次下的所有Item关联 SELECT ib.ItemSN, bm.Heading, bm.Details, bm.Issue1, bm.Issue2, bm.Issue3, bm.Comments, -- 给不同类型的元数据行指定排序优先级,保证顺序符合要求 CASE bm.Heading WHEN 'Date Done' THEN 2 WHEN 'Section1' THEN 3 WHEN 'AreaA' THEN 4 WHEN 'AreaB' THEN 5 ELSE 6 -- 兜底,防止出现未定义的Heading END AS SortOrder FROM BatchMetadata bm JOIN ItemBatch ib ON bm.BatchId = ib.BatchId ) CombinedData -- 先按Item的SN分组,再按SortOrder排序,保证每个Item的行连续且顺序正确 ORDER BY ItemSN, SortOrder;
代码逻辑说明
- ItemBatch CTE:专门筛选出所有
Heading = 'ItemID'的行,同时记录每个Item对应的BatchId和SN号(ItemSN),这是后续复制元数据的核心关联依据。 - BatchMetadata CTE:筛选出所有非ItemID的行,也就是每个批次的公共数据(比如完成日期、各区域的问题记录等)。
- 合并与排序:
- 先用
UNION ALL把原始的Item行和关联后的批次元数据行合并; - 通过
SortOrder字段控制每行的顺序:ItemID行排第一,然后依次是Date Done、Section1、AreaA、AreaB; - 最后按
ItemSN排序,确保同一个Item的所有行连续排列。
- 先用
如果你的数据库不支持CTE(比如MySQL 5.x),可以把CTE替换成子查询,逻辑是完全一样的。
内容的提问来源于stack exchange,提问作者Tiki
相关产品推荐
相关产品推荐

