兼容性判定
公开资料依据 · 建议 PoC 复核支持度none
严重度critical
置信度low
依据规则my.subquery.join_on_correlated
怎么改
先保留子查询在 ON 的原布尔位置;仅已证明为顶层合取且 join 类型/相关侧不改变外行保留的 EXISTS/IN/NOT EXISTS 可改半连接/反连接,OR/NOT/CASE 等组合须物化 true/false/unknown 真值标记并在原布尔位置替换;外连接顶层合取也必须在 ON 内承接,不得预过滤保留侧,且不得移到 WHERE;NOT IN 用 NULL-aware 结果承接 NULL;ANY/ALL 保留空集/三值逻辑;聚合 scalar 要按基数分支:无 GROUP BY 的纯聚合仅在未被 HAVING/LIMIT/OFFSET/集合操作消除时才恰好一行,此时 COUNT 空集=0、其他多数聚合=NULL,按相关键预计算后用 LEFT JOIN/真值标记保留外行并补回默认值。标量基数必须在全部查询块算子之后判定 0/1/多行:零行=>NULL、多行=>报错;GROUP BY/HAVING 及 LIMIT/OFFSET/集合操作不得用普通内连接丢行或 DISTINCT/LIMIT 1 偷压;非聚合 scalar 仅在唯一约束证明至多一行时改写并保留零行 NULL/多行报错;嵌套层逐层暴露并传递相关键,禁止删除子查询或静默去重
判定说明
TiDB 8.5 文档与 v8.5.7 planner 拒绝 JOIN ON 中任意子查询;本 feature 仅覆盖静态可证明相关的子集,未命中不代表支持;建议 PoC 复核精确补丁版本和改写基数
库侧 / 应用侧路径
库侧改造
可行:逐层暴露相关键,用 CTE/派生关系或临时表预计算键与聚合结果,再以显式 JOIN 接回并固定一对一/一对多基数
应用侧改造
可行:查询构建层拆为参数化的预查询与主查询;需要同一快照时保持单事务并限制中间结果规模
推荐路线:db_side。验证建议:覆盖相关键 NULL、无匹配、重复内行、scalar 零/一/多行、内连接顶层合取及 OR/NOT/CASE 中的 EXISTS 真值与 UNKNOWN;另测外连接顶层合取不得预过滤保留侧及空扩展,覆盖嵌套层、影响行数与计划,并用目标精确版本复核 ERROR 1105
规则样例
SELECT a.id FROM t_join_exists a JOIN t_join_exists b ON EXISTS (SELECT 1 FROM t_join_exists c WHERE c.id = a.id)
SELECT a.id FROM t_join_scalar a JOIN t_join_scalar b ON b.v = (SELECT MAX(c.v) FROM t_join_scalar c WHERE c.id >= a.id)
SELECT a.id FROM t_join_exists a JOIN t_join_exists b ON EXISTS (SELECT 1 FROM t_join_exists c WHERE c.id = 1)
参考来源
- https://docs.pingcap.com/tidb/stable/mysql-compatibility/
- https://github.com/pingcap/tidb/blob/v8.5.7/pkg/planner/core/logical_plan_builder.go#L921-L932
- https://github.com/pingcap/tidb/issues/69539
- https://github.com/pingcap/tidb/issues/69540
- https://dev.mysql.com/doc/refman/8.4/en/logical-operators.html
- https://dev.mysql.com/doc/refman/8.4/en/select.html
- https://docs.pingcap.com/zh/tidb/v8.5/sql-statement-overview/
- https://docs.pingcap.com/zh/tidb/stable/sql-mode/
- https://github.com/pingcap/tidb/issues/11414
相关改造点
- MYSQL → tidb 8.5 全部改造点
- tidb 8.5 兼容性总览
- MYSQL 迁移国产库总览
- ORACLE Oracle SQL 治理检查:BUILTIN PRIOR BACKUP CHECK 迁移 tidb 8.5 怎么改
- ORACLE Oracle SQL 治理检查:COLUMN ADD NOT NULL REQUIRE DEFAULT 迁移 tidb 8.5 怎么改
- ORACLE Oracle SQL 治理检查:COLUMN COMMENT 迁移 tidb 8.5 怎么改
- ORACLE Oracle SQL 治理检查:COLUMN MAXIMUM CHARACTER LENGTH 迁移 tidb 8.5 怎么改
- ORACLE Oracle SQL 治理检查:COLUMN MAXIMUM VARCHAR LENGTH 迁移 tidb 8.5 怎么改
- ORACLE Oracle SQL 治理检查:COLUMN NO NULL 迁移 tidb 8.5 怎么改