update语句无法更新到数据(mysql下没问题)

有个SQL语句,同样的表数据,在mysql下执行没有问题,但是tidb下却更新不到数据。
tidb版本:4.0.3

SQL语句:
UPDATE ipb_itemlist a
SET a.invocode = (
SELECT
t1.feecodestat_code
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode
),
a.invoname = (
SELECT
t1.feecodestat_name
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode
),
a.prebalanceid = ‘CBD7F143C08243619F4234DA739CEC5C’
WHERE
1 = 1
AND INID = ‘303216382’
AND BALANCEFLAG = ‘0’
AND FEEDATE >= str_to_date( ‘2020-08-04 13:55:21’, ‘%Y-%m-%d %T’ )
AND FEEDATE <= str_to_date(
‘2020-08-04 14:02:58’,
‘%Y-%m-%d %T’)

表结构和数据:
fin_invoicekind.sql (5.4 KB) fin_staticcode_feecode.sql (46.4 KB) ipb_itemlist.sql (16.5 KB)

上面的SQL语句执行后,invocode和invoname两个字段的值仍然为null,这个效果是不对的,应该有值才对。

请问一下,只根据下面这个 where 语句查询表ipb_itemlist a 的字段 feecode 值,在 mysql 和 tidb 中查询结果集有区别吗?
WHER
1 = 1
AND INID = ‘303216382’
AND BALANCEFLAG = ‘0’
AND FEEDATE >= str_to_date( ‘2020-08-04 13:55:21’, ‘%Y-%m-%d %T’ )
AND FEEDATE <= str_to_date(
‘2020-08-04 14:02:58’,
‘%Y-%m-%d %T’)

没有区别,值都是一样的。类型都是varchar 5
用附件的数据,应该能再现吧?

辛苦将你 tidb 和 mysql 中测试的结果贴出来看下

感谢反馈,
辛苦将 set 语句中,a.invocode ,a.invoname 对应的子查询结果反馈一下,感谢配合,

上面上传的附件里有数据。

嗯,这边查看到 set 中有多个值,所以想看下目前环境的值为多少,可能是没有 order by 导致取出的数据没有顺序,辛苦确认下
image

这样关联查询肯定是多个值的。ipb_itemlist里面就有多条数据。
我们原始SQL语句的目的就是为了批量更新ipb_itemlist中字段的值,字段的值来自子查询的结果。

可以用上面附件的结构和数据在mysql建立一下,比较下差异。
注意调整下where条件的值,以便能取到多条数据。

辛苦返回下 mysql 和 tidb 的 sql_mode 吧,标准语法中对于 set 值需要单一值,不可为多行,否则将去第一行,tidb 目前对select 如果没有 order by 进行约束是不保证返回顺序的。

mysql下的sql_mode
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

tidb下的sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

不太理解您说的标准语法是啥。
但是,同样的语句,在oracle和mysql中都没有问题,但是tidb执行结果不正确。

mysql 中的更新值符合预期吗?是否是正确的值呢?执行下下面的 sql,看下
目前来看

SELECT
t1.feecodestat_name
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2,ipb_itemlist a
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode

返回结果为两行:image

SELECT
t1.feecodestat_name
FROM
fin_staticcode_feecode t1,
fin_invoicekind t2,ipb_itemlist a
WHERE
t1.feecodestat_type = t2.feecodestat_type
AND t2.isvalid = ‘1’
AND t2.invoice_kind = ‘03’
AND t1.feecode = a.feecode;

返回结果为:image

mysql和oracle的结果都符合预期,只有tidb的不符合。
可以参见先前的截图。

你这样的SQL语句对于排查问题是没有意义的,这样的查询结果是正常的,即便到mysql和oracle中也是如此。
我建议重新捋一下,在你们的环境中先再现一下这个问题。

可以用附件的结构和数据。
SQL语句中的where条件部分按数据只保留AND INID = ‘xxxx’这个部分。
其中的值按数据实际情况调整下。

如果有必要的话,我可以重新开一个帖子,直接准备好结构和数据以及能再现问题的语句。

tidb 与 mysql 的行为目前看是不一致的,但是也是怀疑当前更新数据的准确性,请问如何判断多行返回,set哪一行呢,
辛苦反馈下结果?