SQL Server存储过程中更新垂直表unitTax值的技术求助
解决垂直结构临时表更新unitTax的方案
这种EAV(实体-属性-值)结构的临时表更新需求我碰过好多次了,不用改原表结构也能搞定,核心就是把同parentNodeId组的行通过自连接关联起来,拿到需要计算的两个字段值再回写。
具体实现语句
UPDATE t_target SET t_target.fieldValue = t_price.fieldValue * t_tax.fieldValue FROM @tempTable t_target -- 关联同组下的unitPrice行 JOIN @tempTable t_price ON t_target.parentNodeId = t_price.parentNodeId AND t_price.fieldName = 'unitPrice' -- 关联同组下的taxRate行 JOIN @tempTable t_tax ON t_target.parentNodeId = t_tax.parentNodeId AND t_tax.fieldName = 'taxRate' -- 仅更新unitTax对应的目标行 WHERE t_target.fieldName = 'unitTax';
逻辑拆解
- 定位待更新行:通过
WHERE t_target.fieldName = 'unitTax'精准筛选出需要赋值的unitTax行,避免误更新其他字段。 - 关联计算所需字段:两次自连接临时表,分别抓取同一
parentNodeId下的unitPrice和taxRate对应的字段值,确保是同组数据参与计算。 - 执行乘积赋值:直接把两个字段的
fieldValue相乘,结果写入unitTax行的fieldValue中。
示例数据测试验证
假设你的临时表已经插入了测试数据:
INSERT INTO @tempTable (parentNodeId, fieldName, fieldValue) VALUES (2, 'unitPrice', 12.00), (2, 'taxRate', 0.50), (2, 'unitTax', 0.00), -- 初始值待更新 (3, 'unitPrice', 20.00), (3, 'taxRate', 0.10), (3, 'unitTax', 0.00);
执行上述UPDATE语句后,parentNodeId=2的unitTax会被更新为6.00,parentNodeId=3的会更新为2.00,完全符合需求。
容错扩展(可选)
如果担心部分组缺少unitPrice或taxRate导致更新出现NULL值,可以改用LEFT JOIN并通过ISNULL处理空值:
UPDATE t_target SET t_target.fieldValue = ISNULL(t_price.fieldValue, 0) * ISNULL(t_tax.fieldValue, 0) FROM @tempTable t_target LEFT JOIN @tempTable t_price ON t_target.parentNodeId = t_price.parentNodeId AND t_price.fieldName = 'unitPrice' LEFT JOIN @tempTable t_tax ON t_target.parentNodeId = t_tax.parentNodeId AND t_tax.fieldName = 'taxRate' WHERE t_target.fieldName = 'unitTax';
这样即使某组缺失其中一个字段,也会用0参与计算,避免更新失败或出现NULL结果。
内容的提问来源于stack exchange,提问作者DaveP




