SQL Server基于LOINC关联表多值更新AdditionalInfo表的问题咨询
SQL更新问题排查与解决方案
原语句错误点
- 关联逻辑错误:
Panel和PanelTest的关联条件写错,应该是p.panelKey = pt.panelKey而非p.panelKey = pt.panelTestKey,关联字段错误直接导致无法匹配到对应的LOINC数据 - 子查询冗余且关联混乱:不需要拆分两个子查询分别获取code和relatedNames,单次关联即可拿到两个字段,拆分成两个子查询后缺少有效关联条件,会产生笛卡尔积或匹配不到数据
- 过滤条件缺失:没有添加
ai.keyOneType = 6的筛选规则,会误更新其他类型的记录 - 多余的字段匹配规则:子查询中的
ai.keyOne = p.panelKey1、ai.keyOne = p.panelKey2属于无意义条件,原需求关联逻辑就是AdditionalInfo.keyOne = Panel.panelKey,不需要额外匹配其他字段
可行的更新语句
UPDATE Copia.Copia.AdditionalInfo ai SET answerSting = CASE WHEN ai.userDefinedQuestionKey = 60 THEN l.code WHEN ai.userDefinedQuestionKey = 68 THEN l.relatedNames ELSE NULL END FROM Copia.Copia.Panel p INNER JOIN Copia.Copia.PanelTest pt ON p.panelKey = pt.panelKey INNER JOIN Copia.Copia.LOINC l ON pt.loincKey = l.lOINCKey WHERE -- 仅处理指定类型的记录 ai.keyOneType = 6 -- 关联Panel表逻辑 AND ai.keyOne = p.panelKey -- 仅更新目标两个字段的记录,其余不处理;如果需要其余字段置为NULL可以删除这个条件 AND ai.userDefinedQuestionKey IN (60, 68)
语句说明
- 直接通过FROM子句关联
Panel、PanelTest、LOINC三张表,避免冗余子查询,关联逻辑完全匹配需求 - 仅筛选
keyOneType=6的记录,不会误操作其他类型数据 - 如果需要把
userDefinedQuestionKey不是60/68的记录的answerSting统一置为NULL,去掉WHERE子句里的AND ai.userDefinedQuestionKey IN (60, 68)即可
内容的提问来源于stack exchange,提问作者Zach Hoefner
相关产品推荐
相关产品推荐

