You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义函数中合并同主键规则的两张商品表查询价格

实现方案说明

首先修正你现有代码的逻辑错误:你写的销售表查询逻辑中,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:51:19