You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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';

逻辑拆解

  1. 定位待更新行:通过WHERE t_target.fieldName = 'unitTax'精准筛选出需要赋值的unitTax行,避免误更新其他字段。
  2. 关联计算所需字段:两次自连接临时表,分别抓取同一parentNodeId下的unitPricetaxRate对应的字段值,确保是同组数据参与计算。
  3. 执行乘积赋值:直接把两个字段的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=2unitTax会被更新为6.00parentNodeId=3的会更新为2.00,完全符合需求。

容错扩展(可选)

如果担心部分组缺少unitPricetaxRate导致更新出现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

火山引擎 最新活动