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

如何查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:47:45