分组依据和左连接

问题描述 投票:0回答:1
create table test_txn (
    ttid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `PROFILEID` int(11) NOT NULL,
    `MERCHANT_TXN_ID` varchar(32) NOT NULL,
    `TXN_STATUS` int(4) NOT NULL,
    `TXN_TYPE` varchar(6) NOT NULL,
    `TXN_SUB_TYPE` varchar(50) DEFAULT NULL,
    PRIMARY KEY (`ttid`)
);

create table test_summ(
    sumid bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `PROFILEID` int(11) NOT NULL,   
    `MERCHANT_TXN_ID` varchar(32) NOT NULL,   
    `TXN_STATUS` int(4) NOT NULL,   
    `TXN_TYPE` varchar(6) NOT NULL,   
    `TXN_SUB_TYPE` varchar(50) DEFAULT NULL, 
    cnt int(11) NOT NULL, 
    PRIMARY KEY (`sumid`)
);

test_summ 是 test_txn 的汇总表

insert into test_txn 
values (1,1,1,1,2,NULL), (2,1,1,1,2,NULL), (3,1,1,4,2,NULL), (4,2,1,4,2,NULL), (5,2,1,5,2,NULL);

insert into test_summ (
    SELECT NULL, PROFILEID, MERCHANT_TXN_ID, TXN_STATUS, TXN_TYPE, TXN_SUB_TYPE, count(*) cnt 
    from test_txn 
    group by  PROFILEID, MERCHANT_TXN_ID, TXN_STATUS, TXN_TYPE, TXN_SUB_TYPE
);

insert into test_txn 
values (6,2,1,30,2,NULL), (7,2,1,30,2,NULL);

我想从 test_txn 到 test_summ 获取未完成汇总的记录。

我写了这个查询:

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 and b.cnt = c.cnt 
WHERE c.PROFILEID IS NULL;

但它提供了左表中的所有行。理想情况下,它应该给出 TXN_STATUS 为 30 的行。那么什么是正确的查询呢?

我想从交易表中获取结果,这些结果没有在汇总表中汇总。

sql mysql transactions left-join summary
1个回答
0
投票

问题在于在

b.TXN_SUB_TYPE = c.TXN_SUB_TYPE
条件下使用
ON
。由于这些列包含
NULL
,因此条件永远不会为真,因为
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 <=> c.TXN_SUB_TYPE and b.cnt = c.cnt 
WHERE c.PROFILEID IS NULL;
© www.soinside.com 2019 - 2024. All rights reserved.