如何查询test_txn中未被汇总至test_summ的交易记录?
问题分析
你的查询返回所有行的核心原因是**TXN_SUB_TYPE字段的NULL值比较逻辑错误**:SQL中NULL与任何值(包括另一个NULL)进行等值比较时结果都是UNKNOWN,不会被判定为相等。原查询的关联条件里b.TXN_SUB_TYPE = c.TXN_SUB_TYPE无法匹配到test_summ中TXN_SUB_TYPE为NULL的分组,导致原本已经汇总的记录也被误判为未匹配。
正确查询语句
根据数据库支持情况,有两种可行方案:
方案1:使用IS NOT DISTINCT FROM(支持MySQL 8.0.17+、PostgreSQL、SQL Server等)
这个操作符会将NULL视为相等,直接简化NULL值的比较逻辑:
SELECT * from ( select count(*) cnt,a.PROFILEID, a.MERCHANT_TXN_ID, a.TXN_STATUS, a.TXN_TYPE, a.TXN_SUB_TYPE from test_txn a group by a.PROFILEID, a.MERCHANT_TXN_ID, a.TXN_STATUS, a.TXN_TYPE, a.TXN_SUB_TYPE ) b LEFT join test_summ c ON b.PROFILEID = c.PROFILEID AND b.MERCHANT_TXN_ID = c.MERCHANT_TXN_ID AND b.TXN_STATUS = c.TXN_STATUS AND b.TXN_TYPE = c.TXN_TYPE AND b.TXN_SUB_TYPE IS NOT DISTINCT FROM c.TXN_SUB_TYPE AND b.cnt = c.cnt WHERE c.PROFILEID IS NULL;
方案2:兼容所有数据库的NULL比较逻辑
如果你的数据库不支持IS NOT DISTINCT FROM,可以手动处理NULL的匹配:
SELECT * from ( select count(*) cnt,a.PROFILEID, a.MERCHANT_TXN_ID, a.TXN_STATUS, a.TXN_TYPE, a.TXN_SUB_TYPE from test_txn a group by a.PROFILEID, a.MERCHANT_TXN_ID, a.TXN_STATUS, a.TXN_TYPE, a.TXN_SUB_TYPE ) b LEFT join test_summ c ON b.PROFILEID = c.PROFILEID AND b.MERCHANT_TXN_ID = c.MERCHANT_TXN_ID AND b.TXN_STATUS = c.TXN_STATUS AND b.TXN_TYPE = c.TXN_TYPE AND (b.TXN_SUB_TYPE = c.TXN_SUB_TYPE OR (b.TXN_SUB_TYPE IS NULL AND c.TXN_SUB_TYPE IS NULL)) AND b.cnt = c.cnt WHERE c.PROFILEID IS NULL;
验证结果
执行上述任一查询后,会正确返回test_txn中TXN_STATUS=30的分组记录,也就是未被汇总到test_summ的部分。
内容的提问来源于stack exchange,提问作者chaitanya
相关产品推荐
相关产品推荐

