文档首页/ 数据库和应用迁移 UGO/ 用户指南/ 语法转换指南/ 转换错误码/ Oracle To GaussDB 转换错误码/ U0100070:GaussDB使用(+)同一个表不能对应多个外表
更新时间:2025-06-04 GMT+08:00

U0100070:GaussDB使用(+)同一个表不能对应多个外表

描述

数据库类型与版本

  • 源库类型与版本:UGO 支持的 Oracle 版本。
  • 目标库类型与版本:UGO 支持的 GaussDB 版本。

语法示例

WHERE子句中可以通过指定"(+)"操作符的方法将表的连接关系转换为外连接。但是不建议用户使用这种用法,因为这并不是SQL的标准语法,在做平台迁移的时候可能面临语法兼容性的问题。同时,使用"(+)"有很多限制:

  1. "(+)"只能出现在where子句中。
  2. 如果from子句中已经有指定表连接关系,那么不能再在where子句中使用"(+)"。
  3. "(+)"只能作用在表或者视图的列上,不能作用在表达式上。
  4. 如果表A和表B有多个连接条件,那么必须在所有的连接条件中指定"(+)",否则"(+)"将不会生效,表连接会转化成内连接,并且不给出任何提示信息。
  5. "(+)"作用的连接条件中的表不能跨查询或者子查询。如果"(+)"作用的表,不在当前查询或者子查询的from子句中,则会报错。如果"(+)"作用的对端的表不存在,则不报错,同时连接关系会转化为内连接。
  6. "(+)"作用的表达式不能直接通过"OR"连接。
  7. 如果"(+)"作用的列是和一个常量的比较关系, 那么这个表达式会成为join条件的一部分。
  8. 同一个表不能对应多个外表。
  9. "(+)"只能出现"比较表达式","NOT表达式",“ANY表达式”,“ALL表达式”,“IN表达式”,“NULLIF表达式”,“IS DISTINCT FROM表达式”,“IS OF”表达式。"(+)"不能出现在其他类型表达式中,并且这些表达式中不允许出现通过“AND”和“OR”连接的表达式。
  10. "(+)"只能转化为左外连接或者右外连接,不能转化为全连接,即不能在一个表达式的两个表上同时指定"(+)"。

改造建议

建议使用外连接方式,改写示例:

源SQL:

 SELECT A.ID,B.NAME FROM TEST_KEEP A,TEST_KEEP1 B ,TEST_KEEP2 C WHERE A.ID=C.FATHERID(+) AND B.NAME=C.NAME(+);

目标SQL:

 SELECT A.ID,B.NAME FROM TEST_KEEP A CROSS JOIN TEST_KEEP1 B LEFT JOIN   TEST_KEEP2 C  ON  B.NAME=C.NAME AND A.ID=C.FATHERID;