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 的行。那么什么是正确的查询呢?
我想从交易表中获取结果,这些结果没有在汇总表中汇总。
问题在于在
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;