如何在自定义函数中合并同主键规则的两张商品表查询价格
实现方案说明
首先修正你现有代码的逻辑错误:你写的销售表查询逻辑中,select选取的是ItemNo字段,并非价格字段,实际运行会返回商品ID而非采购价,下面的实现代码会一并修复这个问题。
针对你提到的两种实现思路,优先选择IF分支判断方案,原因如下:
- 两张表的
ItemNo取值范围完全互斥,走分支逻辑只会扫描目标单表,无多余查询开销,性能最优 - 逻辑直观易维护,后续如果新增其他编号段的商品表,只需要新增对应判断分支即可
- JOIN方案在当前场景下没有适用价值:同一个
ItemNo不可能同时存在于两张表中,做关联查询没有业务意义,反而会增加不必要的查询开销。如果不想写分支判断,用UNION ALL合并结果集也能实现需求,但性能远低于分支方案。
IF分支版完整实现代码
假设租赁商品表名为Rental,两张表存储采购价格的字段均为PurchasingPrice,如果实际环境的表名、字段名不一致,直接替换对应标识符即可:
DELIMITER $$ create or replace function fn_PurchasingPrice(inItemNo int) returns int begin declare OutPurchasingPrice int; if inItemNo >= 1000 then -- 商品编号>=1000时查询租赁商品表 select PurchasingPrice into OutPurchasingPrice from Rental where ItemNo = inItemNo; else -- 商品编号<1000时查询销售商品表 select PurchasingPrice into OutPurchasingPrice from Sales where ItemNo = inItemNo; end if; return ifnull(OutPurchasingPrice,-1); END$$ DELIMITER ;
可选:UNION ALL 实现(不推荐生产环境使用)
如果不想编写分支判断逻辑,可以通过UNION ALL将两张表的商品编号、价格合并为统一结果集后再查询,代码如下:
DELIMITER $$ create or replace function fn_PurchasingPrice(inItemNo int) returns int begin declare OutPurchasingPrice int; select PurchasingPrice into OutPurchasingPrice from ( select ItemNo, PurchasingPrice from Sales union all select ItemNo, PurchasingPrice from Rental ) as All_Items where ItemNo = inItemNo; return ifnull(OutPurchasingPrice,-1); END$$ DELIMITER ;
该方案每次调用函数都会扫描两张表的全量数据做结果合并,当表数据量较大时查询性能会明显下降,仅适合表数据量极小的测试场景使用。
内容的提问来源于stack exchange,提问作者Jokokosnuss
相关产品推荐
相关产品推荐

