使用 CONVERT ( c.val0, SIGNED ) 语法 解决 两张表的关联字段 id 数据类型不同,关联出错问题

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】5.4
【复现路径】sql 同一张表 自关联 查询
【遇到的问题:问题现象及影响】
sql 如下:

SELECT
a.id,
(
SELECT
IFNULL( sum( c.val2 ), 0 )
FROM
fac_app_data_table_field_val c
WHERE
c.val0 = a.id
AND c.table_id = 1969241186793349598
) AS r15

FROM
fac_app_data_table_field_val a
LEFT JOIN fac_app_data_table_field_val b ON a.id = b.val0
AND b.table_id = 1969243196838052179
AND b.school_id = ‘22’
AND b.flg = ‘Y’
AND b.source = ‘1’
LEFT JOIN fac_app_data_table_field_val e ON a.id = e.val0
AND e.table_id = 1969241186793349598
AND e.school_id = ‘22’
AND e.flg = ‘Y’
AND e.source = ‘1’
LEFT JOIN dictionary_info c ON a.val6 = c.id
AND c.schoolid = ‘22’
AND c.flg = ‘Y’
LEFT JOIN dictionary_info d ON a.val18 = d.id
AND d.schoolid = ‘22’
AND d.flg = ‘Y’
LEFT JOIN user_info ui ON a.val21 = ui.id
AND ui.schoolid = ‘22’
AND ui.flg = ‘Y’
WHERE
a.table_id = 1969243196838052093
AND a.school_id = ‘22’
AND a.flg = ‘Y’
AND a.source = ‘1’
AND a.val6 IN ( ‘中标销售合同’, ‘服务销售合同’ )
and
IF
( ‘blank’ = ‘学校内涵式发展平台’, 1 = 1, a.val3 LIKE concat( ‘%’, ‘学校内涵式发展平台’, ‘%’ ) )
GROUP BY
a.id
问题 如果将 c.val0 = a.id 修改为 CONVERT ( c.val0, SIGNED ) = a.id 那么该条记录1能够正确,但是该列表中记录2 又发生错误,再次改为 c.val0 = a.id 时,记录2能够正确,但是 记录1 又错误了

id 为 bigint 类型 val0为 varchar类型

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

后面的语法太复杂,我怀疑解析器通不过,尽量让语法简单可读

CAST(t1.id AS CHAR)这样转化能关联吗?

id 为 bigint 类型 val0为 varchar类型
肯定要转换成char类型,这样子安全得多,val0又没有限制,可能存在超大数字或者是不能转换的字符,导致SQL报错。

没用过这种高级用法

SIGNED没有查到长度范围是4byte还是8byte的

最根本问题是你表模型设计有问题,隐式转换可能导致非预期结果,https://docs.pingcap.com/zh/tidb/stable/dev-guide-implicit-type-conversion#避免隐式类型转换
把数据贴出来看看,描述不清楚

2 个赞

是的,他这个最好是从根本上去解决,否则搞负负得正的事情迟早还是会有bug