MySQL联表查询如何按规则过滤跨表存在列值的匹配行
符合规则的MySQL查询实现
核心逻辑说明
直接将三条业务过滤规则映射为SQL判断条件,使用NOT EXISTS替代NOT IN,避免关联字段存在NULL值时出现的判断异常问题。
完整查询语句
SELECT t.name, t.ta_over_amount, v.over_amount, v.signature FROM ta02 t LEFT JOIN voucher v ON t.t_key = v.v_key WHERE -- 规则①:当前行左右表金额不相等 t.ta_over_amount <> v.over_amount -- 规则②:当前右表金额不存在于同关联键的左表金额集合 AND NOT EXISTS ( SELECT 1 FROM ta02 t2 WHERE t2.t_key = t.t_key AND t2.ta_over_amount = v.over_amount ) -- 规则③:当前左表金额不存在于同关联键的右表金额集合 AND NOT EXISTS ( SELECT 1 FROM voucher v2 WHERE v2.v_key = t.t_key AND v2.over_amount = t.ta_over_amount );
逻辑校验
- 针对首个测试场景:仅保留
logbasex关联键下phi的15.00与itsme的14.00匹配行,完全匹配预期结果 - 针对补充测试场景:仅保留
gogo关联键下anh的100.00与blue的110.00匹配行,完全匹配预期结果 - 所有金额相等的匹配行、存在于对方同键金额集合的行都会被自动过滤,左连接产生的右表字段为NULL的未匹配行也会因金额比较返回UNKNOWN被自动排除
内容的提问来源于stack exchange,提问作者logbasex
相关产品推荐
相关产品推荐

