SQL如何实现左连接无匹配时回退关联Modifier为00的费率
单条SQL实现带回退规则的费率关联查询
完全可以通过单条SQL实现需求,无需拆分两条语句执行。核心逻辑为优先匹配Procedure+Modifier双字段关联的精确费率,未匹配时自动回退取同Procedure下Modifier=00的基准费率。
推荐方案:两次左连+COALESCE取值(适配大数据量场景)
该方案关联效率更高,逻辑清晰:
- 第一次左连费率表,通过
Procedure + Modifier双字段匹配精确费率 - 第二次左连费率表,固定匹配当前主表行同Procedure下Modifier=00的基准费率
- 用
COALESCE函数优先取第一次匹配到的非空值,未命中则自动取基准费率
假设主表名为main_tbl,费率表名为rates_tbl,对应SQL如下:
SELECT m.Procedure, m.Modifier, COALESCE(r_exact.Rate, r_default.Rate) AS Rate FROM main_tbl m -- 精确匹配双字段的费率 LEFT JOIN rates_tbl r_exact ON m.Procedure = r_exact.Procedure AND m.Modifier = r_exact.Modifier -- 关联取同Procedure下Modifier=00的基准费率 LEFT JOIN rates_tbl r_default ON m.Procedure = r_default.Procedure AND r_default.Modifier = '00'
针对你提供的样例数据,该SQL的运行结果完全符合预期:
- 主表
AA/00行:精确匹配到$10,最终返回$10 - 主表
AA/21行:精确匹配到$20,最终返回$20 - 主表
AA/26行:无精确匹配结果(r_exact.Rate为null),自动取AA/00对应的$10基准费率
简洁实现方案:相关子查询(适配小数据量场景)
如果数据量较小,也可以直接在SELECT中嵌套子查询实现回退逻辑,写法更简洁:
SELECT m.Procedure, m.Modifier, COALESCE( -- 先尝试精确匹配双字段 (SELECT r.Rate FROM rates_tbl r WHERE r.Procedure = m.Procedure AND r.Modifier = m.Modifier), -- 未命中则回退取基准费率 (SELECT r.Rate FROM rates_tbl r WHERE r.Procedure = m.Procedure AND r.Modifier = '00') ) AS Rate FROM main_tbl m
注意:如果费率表存在同一
Procedure + Modifier的重复记录,建议提前对费率表去重后再关联,避免返回多行重复结果。
内容的提问来源于stack exchange,提问作者schen
相关产品推荐
相关产品推荐

