连表更新 计算 类型转换

-- 目标u_order_goods表字段 cinvname cinvname cinvm_unit iquantity 值为u_goods_support中的字段值 条件是u_order_goods.iquantity > u_goods_support.support_exchange
--  关闭自动提交 先测试数据处理的准确定再执行commit
SET autocommit = 0;

--  查询出单条数据做数据验证
SELECT
	og.*,
	o.spare_field2
FROM
	u_order_goods AS og
	LEFT JOIN u_order AS o ON o.id = og.order_id 
WHERE
	o.spare_field2 = 0 and og.id=206145 order by og.iquantity asc;


-- 连表更新
UPDATE u_order_goods AS og
LEFT JOIN u_order AS o ON og.order_id = o.id
LEFT JOIN u_goods_support AS gs ON gs.prod_id = og.cinvcode 
-- 字段赋值采用条件判断og.iquantity >= gs.support_exchange 此处不用关心类型是否相同

SET og.iquantity = (
CASE
	WHEN og.iquantity >= gs.support_exchange THEN
	cast(
	cast(
	-- 计算除法时先转换成DECIMAL 然后算完的值转换后面小数点位数 最后转到char类型
	cast( og.iquantity AS DECIMAL ( 18, 1 ) ) / cast( gs.support_exchange AS DECIMAL ( 18, 1 ) ) AS DECIMAL ( 18, 0 ) 
	) AS CHAR 
	) ELSE og.iquantity 
END 
	),
	og.cinvname = ( CASE WHEN og.iquantity >= gs.support_exchange THEN gs.prod_name ELSE og.cinvname END ),
	og.cinvm_unit = ( CASE WHEN og.iquantity >= gs.support_exchange THEN gs.support_unit ELSE og.cinvm_unit END ) 
WHERE
-- 此处一定要注意条件的类型 varchar要加'
	o.spare_field2 = '0' 
	AND gs.support_unit = '件';
	
--  再次验证查出的数据是否是想要的结果
SELECT
	og.*,
	o.spare_field2
FROM
	u_order_goods AS og
	LEFT JOIN u_order AS o ON o.id = og.order_id 
WHERE
	o.spare_field2 = 0 and og.id=206145 order by og.iquantity asc;
	
	
	
	
-- 验证失败进行回滚
ROLLBACK;
-- 验证成功进行提交
COMMIT;

posted on   何苦->  阅读(25)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示