
# 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;
```
