MYSQL JOIN ON 中的相关子查询

迁移特征 join_on_correlated_subquery 的规则事实、精确目标横向结论与可执行验证路径。产品家族相似性不作为精确版本结论的依据。

pendingcriticallowmy.subquery.join_on_correlated

场景说明

该场景属于“查询与 DML 语法”,适用于 sql、mybatis。权威状态:待核验,不进入权威统计。

正向识别示例

以下均来自规则库中 should_hit=true 的合成公开示例,不是客户代码。

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)

21 个精确目标版本 / 模式

目标支持度证据等级公开边界深入核对
openGauss 5.0 A 模式fulldoc_based未登记额外公开说明,按来源与验证步骤复核。
openGauss 6.0 A 模式fulldoc_based未登记额外公开说明,按来源与验证步骤复核。
PostgreSQL 16 + orafce 4.16fulldoc_based未登记额外公开说明,按来源与验证步骤复核。
PostgreSQL 16fulldoc_based未登记额外公开说明,按来源与验证步骤复核。
TiDB 8.5nonedoc_based未登记额外公开说明,按来源与验证步骤复核。改造点
展开 16 个 unknown / undeclared 结论
达梦 DM8unknownunverified当前事实源不足,不推断兼容。
GaussDB 505(ORA 模式)unknownunverified当前事实源不足,不推断兼容。
GBase 8sunknownunverified当前事实源不足,不推断兼容。
GoldenDB V6unknownunverified当前事实源不足,不推断兼容。
瀚高 HGDB 4.5unknownunverified当前事实源不足,不推断兼容。
人大金仓 KingbaseES V8unknownunverified当前事实源不足,不推断兼容。
OceanBase 4.2.5 MySQL 模式unknownunverified当前事实源不足,不推断兼容。
OceanBase 4.2.5 Oracle 模式unknownunverified当前事实源不足,不推断兼容。
OceanBase 4.3.5 MySQL 模式unknownunverified当前事实源不足,不推断兼容。
OceanBase 4.3.5 Oracle 模式unknownunverified当前事实源不足,不推断兼容。
openGauss 6.0 B 模式(Dolphin)unknownunverified当前事实源不足,不推断兼容。
磐维 PanWeiDB 2.0unknownunverified当前事实源不足,不推断兼容。
磐维 PanWeiDB 3.0 A 模式unknownunverified当前事实源不足,不推断兼容。
PolarDB(Oracle 兼容)2.0unknownunverified当前事实源不足,不推断兼容。
神通数据库 7unknownunverified当前事实源不足,不推断兼容。
TDSQL Boundlessunknownunverified当前事实源不足,不推断兼容。

改造与验证路径

推荐方向

db_side · 先记录子查询在 ON 布尔树中的原位置。只有已证明为顶层合取筛选项,且 join 类型/相关侧不会改变外行保留(通常为内连接)的 EXISTS/IN/NOT EXISTS,才可分别按相关键去重后改半连接/反连接;位于 OR/NOT/CASE 或其他布尔组合时,按相关键物化 true/false/unknown 真值标记并在原布尔位置替换,禁止先过滤外行。外连接顶层合取也必须在 ON 内用真值标记/派生关系承接,不得预过滤保留侧,且不得移到 WHERE;NOT IN 用 NULL-aware 结果承接外值/内集 NULL;ANY/ALL 统计 true/false/unknown 并保留空集与三值逻辑。已有聚合 scalar 要按标量基数分支:无 GROUP BY 的纯聚合仅在未被 HAVING/LIMIT/OFFSET/集合操作继续消除时才恰好返回一行,此时 COUNT 空集=0、其他多数聚合=NULL;按相关键预计算后用左连接/真值标记保留外行并补回该默认值。标量基数必须在全部查询块算子之后判定 0/1/多行:零行=>NULL,多行=>报错;带 GROUP BY/HAVING 以及 LIMIT/OFFSET/集合操作的形态均不得用普通内连接丢行,也不得用 DISTINCT/LIMIT 1 偷压多行。非聚合 scalar 仅在唯一约束证明至多一行时改写,并保留零行 NULL 与多行报错;嵌套层逐层暴露并传递相关键后改 CTE/派生关系或受控临时结果,禁止仅删除子查询或静默去重

库侧

逐层暴露相关键,用 CTE/派生关系或临时表预计算键与聚合结果,再以显式 JOIN 接回并固定一对一/一对多基数 · 风险 manual

应用侧

查询构建层拆为参数化的预查询与主查询;需要同一快照时保持单事务并限制中间结果规模 · 风险 manual

验收步骤

覆盖相关键 NULL、无匹配、重复内行、scalar 零/一/多行、内连接顶层合取及 OR/NOT/CASE 中的 EXISTS 真值与 UNKNOWN;另测外连接顶层合取不得预过滤保留侧及空扩展,覆盖嵌套层、影响行数与计划,并用目标精确版本复核 ERROR 1105

公开来源