SQL结果集有问题

【 TiDB 使用环境】线上
【 TiDB 版本】v6.1
【遇到的问题】查询的结果集有问题
【复现路径】做过哪些操作出现的问题
【问题现象及影响】

create table test.Tab_A (id int primary key,bid int,cid int,name varchar(20),type varchar(20),num int,amt decimal(11,2));
create table test.Tab_B (id int primary key,name varchar(20));
create table test.Tab_C (id int primary key,name varchar(20),amt decimal(11,2));

insert into test.Tab_A values(1,1,1,‘A01’,‘01’,111,111);
insert into test.Tab_A values(2,2,2,‘A01’,‘01’,112,111);
insert into test.Tab_A values(3,3,3,‘A02’,‘02’,113,111);
insert into test.Tab_A values(4,4,4,‘A02’,‘02’,112,111);
insert into test.Tab_A values(5,5,5,‘A01’,‘01’,111,111);
insert into test.Tab_A values(6,6,6,‘A02’,‘02’,113,111);
insert into test.Tab_A values(7,5,7,‘A01’,‘01’,111,88);
insert into test.Tab_A values(8,6,8,‘A02’,‘02’,113,88);
insert into test.Tab_B values(1,‘B01’);
insert into test.Tab_B values(2,‘B01’);
insert into test.Tab_B values(3,‘B02’);
insert into test.Tab_B values(4,‘B02’);
insert into test.Tab_B values(5,‘B02’);
insert into test.Tab_B values(6,‘B02’);
insert into test.Tab_C values(1,‘C01’,3);
insert into test.Tab_C values(2,‘C01’,22);
insert into test.Tab_C values(3,‘C01’,32);
insert into test.Tab_C values(4,‘C01’,5);
insert into test.Tab_C values(5,‘C01’,6);
insert into test.Tab_C values(6,‘C01’,9);

以下执行SQL

select Tab_A.name AAA,Tab_B.name BBB,Tab_A.amt Aamt, Tab_C.amt Bamt,IFNULL(Tab_C.amt, 0)
FROM Tab_A left join Tab_B on Tab_A.bid=Tab_B.id
left join Tab_C on Tab_A.cid=Tab_C.id and Tab_A.type=‘01’
where Tab_A.num=112
±-----------------------------------------------------------+
AAA BBB Aamt Bamt IFNULL(Tab_C.amt, 0)
A01 B01 111.00 22.00 22.00
A02 B02 111.00 NULL 0
±-----------------------------------------------------------+

select Tab_A.name AAA,Tab_B.name BBB,COUNT(Tab_A.id) times,
SUM(Tab_A.amt) - SUM(IFNULL(Tab_C.amt, 0)) amt
FROM Tab_A left join Tab_B on Tab_A.bid=Tab_B.id
left join Tab_C on Tab_A.cid=Tab_C.id and Tab_A.type=‘01’
where Tab_A.num=112
group by Tab_A.name,Tab_B.name
±---------------------------------------------+
AAA BBB times amt
A01 B01 1 89.00
A02 NULL 1 106.00
±--------------------------------------------+
【附件】

请提供各个组件的 version 信息,如 cdc/tikv,可通过执行 cdc version/tikv-server --version 获取。


5.2.3 4.0.13上试了试也是这结果,and后面条件没起作用

示例SQL对么?跑出来的结果都对不上?我这是6.1

6.1版本TiDB,跑出的结果不太一样啊。

select tidb_version();

Release Version: v6.1.0
Edition: Community
Git Commit Hash: 1a89decdb192cbdce6a7b0020d71128bc964d30f
Git Branch: heads/refs/tags/v6.1.0
UTC Build Time: 2022-06-05 05:15:11
GoVersion: go1.18.2
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false

select * from Tab_A

1 1 1 A01 01 111 111.00
2 2 2 A01 01 112 111.00
3 3 3 A02 02 113 111.00
4 4 4 A02 02 112 111.00
5 5 5 A01 01 111 111.00
6 6 6 A02 02 113 111.00
7 5 7 A01 01 111 88.00
8 6 8 A02 02 113 88.00

select * from Tab_B

1 B01
2 B01
3 B02
4 B02
5 B02
6 B02

select * from Tab_C

1 C01 3.00
2 C01 22.00
3 C01 32.00
4 C01 5.00
5 C01 6.00
6 C01 9.00

select Tab_A.name AAA,Tab_A.id,Tab_B.name BBB,Tab_A.amt Aamt, Tab_C.amt Bamt,IFNULL(Tab_C.amt, 0)
FROM Tab_A left join Tab_B on Tab_A.bid=Tab_B.id
left join Tab_C on Tab_A.cid=Tab_C.id and Tab_A.type=‘01’
where Tab_A.num=112

A01 2 B01 111.00 22.00 22.00
A02 4 B02 111.00 NULL 0

select Tab_A.name AAA,Tab_B.name BBB,COUNT(Tab_A.id) times,
SUM(Tab_A.amt) - SUM(IFNULL(Tab_C.amt, 0)) amt
FROM Tab_A left join Tab_B on Tab_A.bid=Tab_B.id
left join Tab_C on Tab_A.cid=Tab_C.id and Tab_A.type=‘01’
where Tab_A.num=112
group by Tab_A.name,Tab_B.name

A01 B01 1 89.00
A02 NULL 1 106.00

我这里是离线安装的v6.1,难道离线和在线的安装包会不同?
就按你这里贴的图,我有两个疑问:
1)为啥你的贴图第二行会有NULL值,不应该显示Tab_B表的name吗?
2)可以查看下Tab_A表的id=4这一行,其type为 ‘02’,按照SQL语义,你的贴图第二行其Bamt不应该为null吗?

我重新操作了一遍,结果跟我发的一样;我没有弄错

我也是6.0跟你的也不一样:sweat_smile:

6.1 on k8s 结果测试


image

我复现对比 TiDB 和 MySQL 的结果是不一样的,TiDB 的结果集好像是有问题,我们再仔细调查下

已经初步定位问题了,应该是 v6.1.0 引入的 bug, 之前的版本没这个问题,感谢发现 bug :heart:

后续修复进度见 issue: https://github.com/pingcap/tidb/issues/37238

A left join B on A.id=B.id and A.id=num ,
A left B on A.id=B.id where A.id=num
on后面就是等值关联,过滤条件是写where 后面,不知道sql_mode有没有一些参数限制第一种写法

该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。