SQL Server 2016存储过程开发:双关联字段嵌套查询插入问题
解决SQL Server 2016双关联字段的嵌套插入问题
嘿,我完全懂你现在的困惑——单字段关联插入没问题,但碰到两个字段都要通过字典表映射的情况就卡壳了对吧?咱们直接上解决方案,结合你的场景来拆解:
首先,核心思路就是通过JOIN操作同时从Code表中映射出两个关联ID,然后把映射后的ID插入到目标表中。我会基于常见的两种Code表结构给你示例,你可以根据实际情况调整。
场景1:Code表是按类型区分的通用字典表
假设你的Code表是通用字典表,结构大概是这样的:
CodeId(int):对应AggregationId/AggregationChildrenIdCodeValue(nvarchar(20)):对应Parent/Serial的字符串值CodeType(nvarchar(20)):区分是父级聚合类型还是子级序列号类型(比如'Parent_Agg'和'Child_Serial')
假设你要插入的目标表是TargetAggregationTable,来源数据存在临时表#SourceData(或者业务表)里,包含Parent、Serial以及其他需要插入的字段。那插入语句可以这么写:
INSERT INTO TargetAggregationTable (AggregationId, AggregationChildrenId, OtherField1, OtherField2) SELECT p_code.CodeId AS AggregationId, s_code.CodeId AS AggregationChildrenId, src.OtherField1, src.OtherField2 FROM #SourceData src -- 关联父级映射 JOIN Code p_code ON src.Parent = p_code.CodeValue AND p_code.CodeType = 'Parent_Agg' -- 替换成你实际的类型标识 -- 关联子级映射 JOIN Code s_code ON src.Serial = s_code.CodeValue AND s_code.CodeType = 'Child_Serial' -- 替换成你实际的类型标识 -- 可选:过滤掉无效数据 WHERE src.Parent IS NOT NULL AND src.Serial IS NOT NULL
场景2:Code表专门存储Parent和Serial的映射关系
如果你的Code表是专门用来关联这两组字段的,结构可能是:
AggregationId(int):父级IDParentCode(nvarchar(20)):父级字符串AggregationChildrenId(int):子级IDSerialCode(nvarchar(20)):子级字符串
这种情况下,只需要一次JOIN就能同时匹配两个条件:
INSERT INTO TargetAggregationTable (AggregationId, AggregationChildrenId, OtherField1) SELECT c.AggregationId, c.AggregationChildrenId, src.OtherField1 FROM #SourceData src JOIN Code c ON src.Parent = c.ParentCode AND src.Serial = c.SerialCode
额外注意事项
- 如果担心
Parent或Serial在Code表中找不到对应ID导致插入失败,可以用LEFT JOIN,然后通过WHERE子句过滤掉映射失败的记录(或者用ISNULL设置默认值,根据业务需求来):INSERT INTO TargetAggregationTable (AggregationId, AggregationChildrenId, OtherField1) SELECT p_code.CodeId AS AggregationId, s_code.CodeId AS AggregationChildrenId, src.OtherField1 FROM #SourceData src LEFT JOIN Code p_code ON src.Parent = p_code.CodeValue AND p_code.CodeType = 'Parent_Agg' LEFT JOIN Code s_code ON src.Serial = s_code.CodeValue AND s_code.CodeType = 'Child_Serial' -- 只保留两个ID都映射成功的记录 WHERE p_code.CodeId IS NOT NULL AND s_code.CodeId IS NOT NULL - 确保Code表中
CodeValue+CodeType(或者ParentCode+SerialCode)是唯一的,避免JOIN后出现重复数据导致插入异常。
内容的提问来源于stack exchange,提问作者VansFannel
相关产品推荐
相关产品推荐

