SQL Server合并多表列生成统一作业表的实现方案
问题根因
原有写法的逻辑偏差在于将「纵向追加两类记录」的需求错误实现为「横向关联后替换字段值」:当表A作业存在对应返工记录时,LEFT JOIN会生成匹配行,此时CASE逻辑直接将该行的作业编号、数量替换为返工记录对应值,原始作业行被直接覆盖,最终仅返回无匹配返工的原始作业、所有返工作业两类数据,自然缺失存在对应返工的原始作业记录。
实现方案(SQL Server环境)
使用UNION ALL做纵向合并是最简洁高效的实现,无需复杂的关联补数逻辑,完全匹配需求:
- 第一段查询直接读取表A全量原始作业记录,无需关联其他表
- 第二段查询将表B关联表A,提取对应原始作业的产品、发布周字段,读取返工作业的编号、数量
- 两段查询字段对齐后合并,最终输出刚好为3条原始作业+3条返工作业共6条记录
对应SQL代码如下:
-- 读取全量原始作业 SELECT [Job Number], [Product], [Quantity], [Release Week] FROM [Table A] UNION ALL -- 读取全量返工作业,关联原始作业补全字段 SELECT B.[Remake Job Number] AS [Job Number], A.[Product], B.[Remake Quantity] AS [Quantity], A.[Release Week] FROM [Table B] AS B INNER JOIN [Table A] AS A ON B.[Original Job Number] = A.[Job Number]
说明:上述代码中使用
INNER JOIN是基于「返工作业必然关联有效原始作业」的业务规则,如果存在脏数据(返工记录无对应原始作业),可替换为LEFT JOIN,按需处理关联为空的字段值即可。
内容的提问来源于stack exchange,提问作者Mike Candiello
相关产品推荐
相关产品推荐

