场景说明
该场景属于“查询与 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 模式 | full | doc_based | 未登记额外公开说明,按来源与验证步骤复核。 | — |
| openGauss 6.0 A 模式 | full | doc_based | 未登记额外公开说明,按来源与验证步骤复核。 | — |
| PostgreSQL 16 + orafce 4.16 | full | doc_based | 未登记额外公开说明,按来源与验证步骤复核。 | — |
| PostgreSQL 16 | full | doc_based | 未登记额外公开说明,按来源与验证步骤复核。 | — |
| TiDB 8.5 | none | doc_based | 未登记额外公开说明,按来源与验证步骤复核。 | 改造点 |
展开 16 个 unknown / undeclared 结论
| 达梦 DM8 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| GaussDB 505(ORA 模式) | unknown | unverified | 当前事实源不足,不推断兼容。 |
| GBase 8s | unknown | unverified | 当前事实源不足,不推断兼容。 |
| GoldenDB V6 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| 瀚高 HGDB 4.5 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| 人大金仓 KingbaseES V8 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| OceanBase 4.2.5 MySQL 模式 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| OceanBase 4.2.5 Oracle 模式 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| OceanBase 4.3.5 MySQL 模式 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| OceanBase 4.3.5 Oracle 模式 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| openGauss 6.0 B 模式(Dolphin) | unknown | unverified | 当前事实源不足,不推断兼容。 |
| 磐维 PanWeiDB 2.0 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| 磐维 PanWeiDB 3.0 A 模式 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| PolarDB(Oracle 兼容)2.0 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| 神通数据库 7 | unknown | unverified | 当前事实源不足,不推断兼容。 |
| TDSQL Boundless | unknown | unverified | 当前事实源不足,不推断兼容。 |
改造与验证路径
推荐方向
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
公开来源
- 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://github.com/pingcap/tidb/issues/11414
- https://dev.mysql.com/doc/refman/8.4/en/logical-operators.html
- https://dev.mysql.com/doc/refman/8.4/en/select.html