DB2 10.5 for Linux, UNIX, and Windows

外连接运算符

设置 DB2_COMPATIBILITY_VECTOR 注册表变量来支持外连接运算符 (+) 时,查询可以在 WHERE 子句的谓词中使用此运算符作为备用语法。

连接是指根据信息的某些公共域对来自两个或更多个表的数据进行组合的过程。当相应行中的信息与基本连接条件相匹配时,一个表中的行与另一个表中的行匹配。外连接会返回所有满足连接条件的行,还会从其行都不满足该连接条件的一个或两个表返回部分或全部行。如果可行,那么还应该使用 RIGHT OUTER JOIN、LEFT OUTER JOIN 或 FULL OUTER JOIN 的外连接语法。应该仅在从数据库产品(而不是 DB2® 产品)启用应用程序以在 DB2 数据库系统上运行时使用外连接运算符。

启用

通过将 DB2_COMPATIBILITY_VECTOR 注册表变量设置为十六进制值 0x04(位位置 3),然后停止并重新启动该实例以使新设置生效,从而启用外连接运算符支持。
db2set DB2_COMPATIBILITY_VECTOR=04
   db2stop
   db2start
要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。

示例

您将括号中应用的外连接运算符 (+) 跟在谓词中的列名称之后,该谓词从两个表的列引用,如以下示例所示:
  • 以下查询执行表 T1 和 T2 的左外连接。在 FROM 子句中包括两个表,由逗号分隔。在同时引用了 T1 的谓词中将外连接运算符应用于 T2 中的所有列。
       SELECT * FROM T1
         LEFT OUTER JOIN T2 ON T1.PK1 = T2.FK1
           AND T1.PK2 = T2.FK2
    以前的查询等于以下一个列,它使用外连接运算符:
       SELECT * FROM T1, T2
         WHERE T1.PK1 = T2.FK1(+)
           AND T1.PK2 = T2.FK2(+)
  • 以下查询执行表 T1 和 T2 的右外连接。在 FROM 子句中包括这两个表,使用逗号进行分隔,并在同时引用了 T2 的谓词中将外连接运算符应用于 T1 中的所有列。
       SELECT * FROM T1
         RIGHT OUTER JOIN T2 ON T1.FK1 = T2.PK1
           AND T1.FK2 = T2.PK2
    以前的查询等于以下一个列,它使用外连接运算符:
       SELECT * FROM T1, T2
         WHERE T1.FK1(+) = T2.PK1
           AND T1.FK2(+) = T2.PK2
有时,对列标记了外连接运算符的表称为 NULL 生成者

一组由 AND 运算符分隔的谓词被称为 AND 因子。如果 WHERE 子句未包含任何 AND 运算符,那么该 WHERE 子句中的谓词集被视为唯一的 AND 因子。

规则

以下规则应用于外连接运算符:
  • 谓词
    • 考虑 WHERE 谓词时,以进行 AND 运算的布尔因子为粒度。
    • 可以存在局部谓词(例如 T1.A(+) = 5),但它们通过连接来执行。不带 (+) 的局部谓词将在连接之后执行。
  • 布尔
    • 每个布尔项最多可以引用两个表,例如,不允许 T1.C11 + T2.C21 = T3.C3(+)
    • 不允许对外连接布尔项进行关联。
  • 外连接运算符
    • 无法在显式的 JOIN 语法所在的同一子选择中指定外连接运算符
    • 只能在作用于同一个子选择的 FROM 子句所指定表的相关联列的 WHERE 子句中,指定外连接运算符。
    • 无法将外连接运算符应用于整个表达式。在 AND 因子中,每个来自同一个表的列引用都必须后跟外连接运算符,例如 T1.COL1 (+) - T1.COL2 (+) = T2.COL1
    • 只能在作用于同一个子选择的 FROM 子句所指定表的相关联列的 WHERE 子句中,指定外连接运算符。
  • NULL 生成者
    • 每个表最多可以是另外一个表的 NULL 生成者。如果一个表连接到第三个表,那么它必须是外表。
    • 仅将某个表作为查询中另一个表的 NULL 生成者使用一次。
    • 无法将同一个表同时用作构成循环的不同外连接中的外表和 NULL 生成者。如果谓词的链返回到先前的表,那么表示跨多个连接构成循环。
      例如,以下查询从 T1 作为第一个谓词中的外表开始,然后在第三个谓词中返回到 T1,从而构成循环。T2 同时用作第一个谓词的 NULL 生成者以及第二个谓词中的外表,但此用法本身不是循环。
      SELECT ... FROM T1,T2,T3
        WHERE T1.a1 = T2.b2(+)
          AND T2.b2 = T3.c3(+)
          AND T3.c3 = T1.a1(+)   -- 无效的循环
  • AND 因子
    • 一个 AND 因子只能将一个表作为 NULL 生成者。每个后跟外连接运算符的列引用都必须来自同一个表。
    • 包含外连接运算符的 AND 因子最多可以引用两个表。
    • 如果两个表之间的外连接需要多个 AND 因子,那么必须在所有这些 AND 因子中指定外连接运算符。如果 AND 因子未指定外连接运算符,那么将对外连接的结果处理该因子。
    • 谓词只涉及一个表的 AND 因子可以指定外连接运算符的条件是,至少有另一个 AND 因子符合以下条件:
      • AND 因子必须涉及与 NULL 生成者相同的表。
      • AND 因子必须涉及作为外表的另一个表。
    • 如果 AND 因子包含只涉及一个表的谓词并且不包含外连接运算符,那么它将对连接结果进行处理。
    • 包含外连接运算符的 AND 因子必须遵循在所连接表下定义的 ON 子句的连接条件规则。