联合表
联合表指定一个中间结果表,该表是内联接、外联接或交叉联接的结果。 该表是通过对其操作数应用以下连接运算符之一得出的:INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER或CROSS。
交叉连接表示表格的交叉乘积,其中左表每一行与右表每一行相乘。 内连接可以看作是表格的交叉乘积,只保留连接条件为真的行。 结果表中可能缺少一个或两个连接表的行。 外部连接包括内部连接产生的行以及缺失的行,具体取决于外部连接的类型,如下所示:
- 左外连接
- 左外连接的结果包括左表中内连接所缺少的行。
T1 LEFT OUTER JOIN T2的结果由成对的行组成,对于 T1 的每行非成对行,则与 T2 的空行连接。 所有列都来自 T2 ,允许为空值。 更多信息,请参阅左外连接。 - 右外连接
- 正确的外部连接结果包括右表中缺少的行,这些行在内部连接中缺失。
T1 RIGHT OUTER JOIN T2的结果由成对的行组成,对于 T2 的每行非成对行,则与 T1 的空行连接。 所有列都来自 T1 ,允许为空值。 更多信息,请参阅右外连接。 - 全外连接
- 完全外部连接的结果包括内部连接中缺失的两个表中的行。
T1 FULL OUTER JOIN T2的结果由它们成对的行组成,对于 T1 的每行非成对行,该行与 T2 的空行连接,对于 T2 的每行非成对行,该行与 T1 的空行连接。 结果表的所有列都允许空值。 更多信息,请参阅全外连接。
联合表可用于任何使用 SELECT 语句的场合。 如果SELECT语句包含连接表 ,则视图和光标均为只读。
如果指定了 LEFT OUTER JOIN、RIGHT OUTER JOIN 或 FULL OUTER JOIN:
- 仅当表标识符标识的基表包含行更改时间戳列时,行更改时间戳表达式才可以在外部联接的子选择中引用。
- RID内置函数和ROW CHANGE TOKEN表达式不能在包含FROM子句的子选择中指定。
join-condition 语法
对于内圈、外圈左和右
对于FULL OUTER
完整表达
join-condition 描述
对于内、左外和右外连接, 连接条件 是一个搜索条件 ,必须符合以下规则:
- 有一个例外,它不能包含任何子查询。 如果在关联的 FROM 子句中,包含连接条件的 连接表仅由内连接组成,则连接条件可以包含子查询。
- 在连接条件表达式中引用的任何列必须是关联连接操作符操作数表(在同一连接表子句的作用域中)的列。
对于FULL OUTER(或FULL)连接, 连接条件是一个搜索条件,其中谓词只能与AND结合。 此外,每个谓词必须采用“表达式=表达式”的形式,其中,一个表达式仅引用关联联接运算符的其中一个操作数表的列,另一个表达式仅引用另一个操作数表的列。 表达的价值观必须具有可比性。 FULL OUTER join不支持数字和字符串数据类型之间的隐式转换。
FULL OUTER连接中的每个全连接表达式必须包含列名或引用列的转换函数。 允许使用COALESCE函数。
对于任何类型的连接,在应用有关列必须属于哪些表的任何规则之前,先使用列名限定符和列名的解析中指定的列名限定符解析规则来解析连接条件表达式中的列引用。
连接操作
当一行 T1 与一行 T2 相加时,结果行由该行 T1 的值与该行 T2 的值相连接组成。 执行时可能会生成空行。 表的空行由表的每一列的null值组成,无论列是否允许null值。
以下列表总结了各种内外连接操作的结果:
T1 INNER JOIN T2的结果由成对的行组成。 如果未指定连接运算符,则默认为INNER。 LEFT OUTER JOIN 或 RIGHT OUTER JOIN 的执行顺序会影响结果。T1 LEFT OUTER JOIN T2的结果由成对的行组成,对于 T1 的每行非成对行,则与 T2 的空行连接。 所有列都来自 T2 ,允许为空值。T1 RIGHT OUTER JOIN T2的结果由成对的行组成,对于 T2 的每行非成对行,则与 T1 的空行连接。 所有列都来自 T1 ,允许为空值。T1 FULL OUTER JOIN T2的结果由它们成对的行组成,对于 T1 的每行非成对行,该行与 T2 的空行连接,对于 T2 的每行非成对行,该行与 T1 的空行连接。 结果表的所有列都允许空值。T1 CROSS JOIN T2的结果由 T1 的每一行与 T2 的每一行相乘得出。 CROSS JOIN也称为笛卡尔积。 交叉连接也可以不使用CROSS JOIN语法来指定,只需在FROM子句中列出两个表,并用逗号隔开,而不使用WHERE子句来提供连接条件。
连接操作是 FROM 子句的一部分。 为了预测包含连接操作的 SELECT 语句将返回哪些行,假设连接操作在语句中的其他子句之前执行。
外部连接示例
以下示例使用两个表:零件表(PARTS)和产品表(PRODUCTS),它们由硬件供应组成。
下图显示,PARTS表中的每一行都包含单个零件的数据:零件名称、零件编号和零件供应商。
下图显示,产品表中的每一行都包含单个产品的数据:产品编号、名称和价格。
下图显示了如何使用外部连接函数将“零件”和“产品”表进行组合。 插图基于每个表格中的一部分列。
内部连接由行组成,这些行由“零件”和“产品”表中的行组成,其依据是“零件”表中的“产品编号”列与“产品”表中的“产品编号”列的列值相等。 当 PROD# 列不相等时,内部连接不包含任何由不匹配的列组成的行。
您可以在查询的 FROM 子句中指定连接。 满足搜索条件的行中的数据从所有表中合并到结果表中。
如果最外层的SELECT列表引用了基本列,则连接的结果列将带有名称。 但是,如果您使用某个函数(例如COALESCE)来构建结果列,则除非您在SELECT列表中使用AS子句,否则该列没有名称。
