SQL兼容性问题

【 TiDB 使用环境】生产环境
【 TiDB 版本】5.7.25-TiDB-v5.1.2 \5.7.25-TiDB-v4.0.16

【遇到的问题:问题现象及影响】相同的SQL在v4.0.16上执行正常,在v5.1.2上报语法错误
SELECT * from ((SELECT vin,veh_series_no,veh_variable_model_no,current_version,vehicle_purpose,vehicle_status,current_vehicle_version_status FROM xx_version WHERE veh_series_no=‘xx’ and current_version in (‘4.2.1-1.7.114’) and is_delete = 0 and current_vehicle_version_status in (“1”)) as a JOIN (SELECT row_number() over (PARTITION by vin order by event_time desc) as number,vin,event_type,target_version,event_time,error_type,error_reason,message_id FROM xx_upgrade_status WHERE current_version in (‘4.2.1-1.7.114’) and is_delete = 0 ) as b ON a.vin = b.vin and b.number = 1 );

【资源配置】
【附件:截图/日志/监控】


感觉和开窗函数有关,SQL 中有相关关键字吧,调试下看看吧

对比下执行计划看看,4.X 和 5.X 的差别确实很大

把最外层的括号去掉就可以了,还是不同版本兼容性行问题哈,能帮忙解析下原理嘛,5.x的版本为啥不支持呢

要是改为在最外层括号后面添加个别名,能执行成功吗?
我查了官方文档:
Oracle 与 TiDB 函数和语法差异对照 | PingCAP 文档中心

这部分看是5.4版本开始添加的内容,说是TiDB要求每个派生表必须有别名。

1 个赞

SELECT
*
FROM
(SELECT
vin,
veh_series_no,
veh_variable_model_no,
current_version,
vehicle_purpose,
vehicle_status,
current_vehicle_version_status
FROM
xx_version
WHERE veh_series_no = ‘xx’
AND current_version IN ('4 .2.1-1.7.114 ')
AND is_delete = 0
AND current_vehicle_version_status IN (‘1’)) AS a
JOIN
(SELECT
row_number () over (
PARTITION BY vin
ORDER BY event_time DESC
) AS number,
vin,
event_type,
target_version,
event_time,
error_type,
error_reason,
message_id
FROM
xx_upgrade_status
WHERE current_version IN (‘4 .2.1-1.7.114’)
AND is_delete = 0) AS b
ON a.vin = b.vin
AND b.number = 1
;
这样查试试还报错吗?

哦吼,还可以不加别名?我们从sqlserver过来的,一直都加别名的

最外层 括号不去掉,加个 as t 试试。

嗯,去掉最外面的括号是可以的

这样也没问题,SQL语法咱高版本不应该向下兼容嘛,集群升级了业务就出问题了 :smile:

本身应该就是要加 as t 的,我估计是低版本没有报错是非预期的。你可以试试 MySQL

你可以看下两个库的sqlmod,是不是sql格式低版本库的要求低

还是应该遵循开发规范的