Python环境下用MySQL JOIN优化history_price表NULL字段批量填充
用单条UPDATE JOIN语句完成批量填充
直接通过UPDATE ... JOIN语句就能一次性完成asset_id和volume的批量填充,无需循环执行多次查询,大幅提升效率:
UPDATE history_price h JOIN param_asset p ON h.Ticker = p.Ticker -- 若需模糊匹配,可改为 h.Ticker LIKE CONCAT('%', p.Ticker, '%') SET h.asset_id = p.asset_id, h.volume = CAST(h.Price AS DECIMAL(10,2)) * CAST(h.Quantity AS DECIMAL(10,2)) WHERE h.volume IS NULL; -- 若asset_id也存在大量NULL,可追加条件:AND h.asset_id IS NULL
逻辑说明
- 表关联:通过
Ticker字段将history_price(别名h)与param_asset(别名p)关联,一次性获取所有待填充的asset_id - 批量赋值:在
SET子句中同时完成asset_id的填充和volume的计算(用CAST确保字符串类型的Price/Quantity转为数值,避免运算错误) - 精准过滤:通过
WHERE仅更新volume为NULL的记录,不干扰已有有效数据
安全验证建议
执行UPDATE前先运行查询确认结果符合预期:
SELECT h.Ticker, h.Price, h.Quantity, p.asset_id, CAST(h.Price AS DECIMAL(10,2)) * CAST(h.Quantity AS DECIMAL(10,2)) AS calculated_volume FROM history_price h JOIN param_asset p ON h.Ticker = p.Ticker WHERE h.volume IS NULL;
若存在Ticker无法匹配的情况,可改用LEFT JOIN并设置默认值(比如h.asset_id = COALESCE(p.asset_id, 0)),但优先确保Ticker能与param_asset正确关联。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

