表引用
表引用将结果表指定为表、视图或中间表。
表格引用的语法
时期规格
- 1 AS OF TIMESTAMP 可以作为备选项,其处理方式与指定 FOR SYSTEM_TIME AS OF 相同。
- 2 SYSTEM_TIME 和 BUSINESS_TIME 不能在每个表中指定多次。
表格参考说明
- 如果指定了单表引用 ,且该引用不是已启用归档的表或临时表,则中间结果表就是指定的表。 如果还指定了期间规格 ,则中间结果表由时间表中期间与规格匹配的行组成。
- 如果指定了单表引用 ,并且该引用是启用了归档的表,则 SYSIBMADM.GET_ARCHIVE 全局变量和ARCHIVESENSITIVE绑定选项的设置将决定中间结果表的内容。 如果全局变量设置为Y,绑定选项设置为YES,则中间结果表将包含关联的归档表中的行。 否则,中间结果表将不包括关联的归档表中的行。
- 如果指定了单视图引用 ,但没有指定句点 ,则中间结果表就是该视图。 如果指定了期间规格 ,视图中的时间表引用将仅考虑期间与规格匹配的行。
- 如果指定了嵌套表表达式 ,则结果表为指定的全选的结果。 结果列不需要唯一名称,但无法明确引用非唯一名称的列。
- 如果指定了数据更改表引用 ,则中间结果表是直接受数据更改语句影响的行集。
- 如果指定了表函数引用 ,则中间结果表就是由表函数返回的一组行。
- 如果指定了表定位参考 ,则主机变量表示中间结果表。 中间结果表的结构与表名中指定的表相同。
- 如果指定了集合派生表 ,则中间结果表是一组来自一个或多个数组值的行。 更多信息,请参阅衍生表。
- 如果指定了 xmltable-expression ,则中间结果表就是 XMLTABLE表函数返回的一组行。
- 如果指定了连接表 ,则中间结果表是一个或多个连接操作的结果。 更多信息,请参阅 joined-table。
每个表中指定的每个表名或视图名 FROM 同一 SQL 语句的子句必须标识同一时间存在的表或视图 Db2 子系统。 子查询中的基本谓词中指定了子句,则包含 FROM 子查询中的基本谓词,则包含 GROUP BYHAVING 则不能识别。
表引用不能识别为XML列隐式创建的表。
- 表格定位变量
- table-locator-variable 必须指定一个带有表定位符类型的变量。 为表定位器赋值的唯一方法是将触发器的旧转换表或新转换表传递给用户定义的函数或存储过程。 表定位器的主变量不能为空。 表定位变量不能是参数标记。 此外,表定位器只能用于操作型 SQL 语句。
触发器正文中不得指定表定位参考。
如果由 table-locator-variable 标识的转换表用于在具有 Unicode 列的 EBCDIC 表上定义的触发器,则 table-name 必须引用具有 Unicode 列的 EBCDIC 表。
- 嵌套表表达式
- 括号中的全选称为嵌套表格表达式。 如果指定了嵌套表表达式,则结果表就是该嵌套表表达式的结果。 结果列不需要唯一名称,但具有非唯一名称的列不能被引用。 在任何时候,表格中的行都是执行完全选择后的结果。
- 表格功能参考
- 如果指定了函数名称 ,则结果表是表函数返回的行集。
表达式中不能包含标量全选、函数或列引用。
每个函数名及其参数类型必须解析为同一 Db2 子系统中的表函数。 函数解析中描述的一种称为函数解析的算法使用函数名称和参数来确定要使用的确切函数。 除非在相关子句中给出列名,否则表函数的列名就是CREATE FUNCTION语句的RETURNS子句中指定的列名。 这类似于在CREATE TABLE语句中定义的表列名。
如果使用列掩码来隐藏最终结果表中的列值,并且使用表函数的结果来推导最终结果表,则列掩码不能应用于在表函数的参数中指定的列。
- 表-UDF-基数-子句
- 在子查询中,可以在 FROM 子句的表说明中为每个用户定义的表函数引用指定表-UDF-基数-子句。 此选项仅对包含它的 SELECT 语句指示预期的返回行数。
CARDINALITY integer-constant 指定对用户定义函数返回的预计行数的估计。 整数值常量的取值范围必须为0-2147483647。
表格函数名称在 SYSIBM.SYSROUTINES 的基数字段中设置的值用作参考基数值。 指定的 CARDINALITY MULTIPLIER 数字常量和参考基数值的乘积被 Db2 用作表函数reference返回的预期行数。
在这种情况下, 数字常量可以是整数、十进制或浮点格式。 该值必须大于或等于零。 如果使用十进制数字表示法,则数字最多可有31位。 整数被视为不带小数的十进制数。 浮点数的最大值约为 7.237E + 75。 如果未在 SYSIBM.SYSROUTINES 的基数字段中设置值,则使用默认值作为参考基数值。 如果指定了零或计算出的基数小于1,则 Db2 假定用户定义的表函数的引用基数为1。
只有数字常量可以跟在关键词之后 CARDINALITY 或 CARDINALITY MULTIPLIER。 基数选项中不允许使用宿主变量或参数标记。 在表格函数引用中指定基数选项不会更改 SYSIBM.SYSROUTINES 中的相应 CARDINALITY 字段。 当创建用户定义的表函数时, SYSIBM.SYSROUTINES 中的CARDINALITY字段值可通过CREATE FUNCTION(外部表)语句中的 CARDINALITY 选项初始化。 它可以通过 CARDINALITY ALTER FUNCTION语句中的选项或直接更新操作,将 SYSIBM.SYSROUTINES。
- 数据变更表参考
- 数据更改表引用子句用于指定中间结果表。 此表基于由子句中SQL数据更改语句直接更改的行。 数据更改表引用只能作为唯一表引用指定在外部全选语句的 FROM 子句中,且该全选语句必须位于子选择语句或 SELECT INTO 语句中。 游标的SELECT语句中的数据更改表引用使游标只能读取。 SQL数据更改语句的目标表或视图是查询中引用的表或视图。 授权ID声明所包含的权限必须包括对目标表或视图的SELECT权限。 SELECT结果表的编码方案必须与数据变更表引用的目标表或视图的编码方案相同。
如果对数据更改语句的目标执行行访问控制,则中间结果表中的行已经满足启用行权限中指定的规则。 如果对数据更改语句的目标实施了列访问控制,则启用的列掩码将应用于最外层的select列表。 更多信息,请参阅选择子句。 如果将包含子句指定为SQL数据更改语句的一部分,并且这些附加列出现在最外层的select列表中,则列值不得来自已定义列掩码的列。
只有在指定了旧表或表达式不包含以下对象时,才能选择表格引用中视图的选择列表中的表达式:
- 用于读取或修改SQL数据的函数
- 一个定义为不确定或有外部作用的函数
- 序列的下一个值表达式
- FINAL TABLE
- 指定中间结果表的行表示在SQL数据更改语句结束时出现的、由SQL数据更改语句更改的行集。 如果存在“后触发器”,导致对作为SQL数据更改语句目标的表进行进一步操作,则将返回错误。 如果SQL数据更改语句的目标是一个视图,而该视图是用INSTEAD OF触发器定义的,则返回错误。
- OLD TABLE
- 中间结果表的行表示在应用 SQL 数据更改语句之前存在的一组受影响行。
- 插入语句
- 指定INSERT语句,如 INSERT语句中所述。 INSERT语句中的全选不能包含对INSERT语句全选之外的列的相关引用。 INSERT语句的目标必须是基本表、使用 WITH CASCADED CHECK 子句定义的视图,或者视图定义中没有 WHERE 子句。 如果全选中的其他地方有输入变量,则INSERT语句不能是多行非原子插入,也不能是指定 USING DESCRIPTOR 子句。
- MERGE 语句
- 指定MERGE语句, 如MERGE语句中所述。 MERGE语句必须符合以下规则:
MERGE语句的目标必须是基本表、使用WITH CASCADED CHECK子句定义的视图,或者视图定义中没有WHERE子句的视图。
MERGE语句的目标表或视图不能包含具有ROWID数据类型的列。 此外,当指定NOT ATOMIC CONTINUE ON SQLEXCEPTION时,MERGE语句的目标表或视图不得包含LOB或XML数据类型的列。
如果在MERGE语句中指定了表引用 ,则该引用不得包含对MERGE语句中表引用之外的列的相关引用。
如果在MERGE语句中指定了表引用 ,则不允许存在导致对目标表进行进一步操作的AFTER触发器。
当MERGE语句中指定了NOT ATOMIC CONTINUE ON SQLEXCEPTION,或者未指定NOT ATOMIC CONTINUE ON SQLEXCEPTION子句,但指定了源值 (VALUES)时,MERGE语句中不得包含删除操作。
- 搜索更新语句
- 指定一个搜索的UPDATE语句,如 UPDATE语句中所述。 UPDATE语句中的WHERE子句或SET子句不能包含与UPDATE语句之外的列相关的引用。 UPDATE语句的目标必须是基本表、对称视图或视图定义中没有WHERE子句的视图。
如果所搜索的UPDATE语句在SELECT语句中使用,并且UPDATE语句引用了视图,则必须使用WITH CASCADED CHECK OPTION子句定义该视图。
在SELECT语句中搜索UPDATE语句不会清除表的AREO*状态。
目标表上不能存在导致对目标表进行进一步操作的AFTER触发器。
- 搜索 DELETE 语句
- 指定一个搜索DELETE语句,如 DELETE语句中所述。 DELETE语句中的WHERE子句不能包含对DELETE语句之外列的相关引用。 DELETE语句的目标必须是基本表、对称视图或视图定义中没有WHERE子句的视图。
如果所搜索的 DELETE 语句用于 SELECT 语句,且 DELETE 语句引用了视图,则必须使用 WITH CASCADED CHECK OPTION 子句定义该视图。
目标表上不能存在导致对目标表进行进一步操作的AFTER触发器。
当光标打开时,包含 SQL 数据更改语句的表引用中间结果表的内容确定。 中间结果表包含目标表(包括隐含隐藏的列)或视图的每一列。 SQL数据更改语句的目标表或视图的所有列都可以使用目标表或视图中的列名进行访问,除非这些列通过使用相关子句进行了重命名。 如果将包含子句指定为SQL数据更改语句的一部分,则中间结果表将包含这些附加列。
- correlation-clause
- 关联子句中的每个关联名都定义了前一个结果表的指代符,可用于限定对表列的引用。 更多信息,请参阅相关条款。FROM子句中所有表引用的公开名称应唯一。 公开姓名是指以下任何一种姓名:
- 关联名称
- 一个表名后面没有关联名
- 一个视图名后面没有关联名
- 一个函数名后面没有关联名
- 当表定位符后面没有关联名称时,在 LIKE 后面指定的表名称
- 数据变更表引用中不包含关联名称的目标表或视图名称
- 别名后面没有关联名称
- 一个同义词 ,后面没有关联词
如果关联子句不跟随 xmltable-expression引用 、嵌套表表达式引用或集合派生表引用 ,则该表引用没有暴露名称。
任何对专栏的引用必须使用公开的名字。 如果同一个名称被指定了两次,则至少有一个规格应带有相关名称。 关联名称用于限定对表或视图列的引用。 当指定关联名称时,还可以指定列名,为表引用的列命名。 如果关联子句中不包含列名,则暴露的列名按以下方式确定:- 当表引用 为表名 、视图名 、别名或同义词时,引用表或视图的列名
- 当表引用 是函数名称引用时,CREATE FUNCTION语句的RETURNS子句中指定的列名称
- 当表引用 是一个表定位符时,在 LIKE 后面引用的表的列名
当表引用 是xmltable-expression 时, xmltable-expression 的COLUMNS子句中指定的列名
当表引用是嵌套表表达式时,fullselect返回的列名
- 当表引用是数据更改表引用时,数据更改语句的目标表中的列名以及任何定义的 INCLUDE 列
- 类型相关性子句
- 类型相关子句定义了通用表函数生成的表格的外观和内容。 当表函数引用是一个通用表函数时,必须指定此条款,且不能用于任何其他表引用。 更多信息,请参阅类型相关子句。
- XML表格表达式
- 指定对内置XMLTABLE函数的调用。 更多信息,请参阅 XMLTABLE表函数。
如果使用列掩码来隐藏最终结果表中的列值,并且使用XMLTABLE函数的结果来生成最终结果表,则列掩码不能应用于XMLTABLE函数的PASSING子句中指定的列。
- 衍生自收藏的表格
- 集合派生表用于将一个或多个数组的元素转换为中间结果表中单独行中的列值,如集合派生表中所述。
- 联合表
- 如果指定了连接表 ,则结果表是连接表中所描述的一个或多个连接操作的结果。
- 时期规格
- 指定一个时间规范适用于表引用。 同一时期名称(SYSTEM_TIME或BUSINESS_TIME)在同一张表中不能指定多次。 如果表格引用指定了视图,则该视图的定义不得引用用户定义的函数。
表格中的行号是通过应用指定的期间规格得出的。
中间结果表不包括关联历史表中的行,这些行是为系统周期时间表定义中的ON DELETE ADD EXTRA ROW属性添加的。
备注:
历史表仅包含 Db2 存储的记录相关系统周期时间表历史的行。 但是,如果历史表中与系统周期时间表中行首和行尾两列对应的两个列中存在其他具有相同值的行,则中间结果表中可能包含这些行。 以下情况可能包含这些行:- 系统周期临时表定义为ON DELETE ADD EXTRA ROW属性,该表包含一个数据更改操作列,且历史表中相应列的值不是“D”。
- 系统周期时间表未定义ON DELETE ADD EXTRA ROW属性。

视图参考的行是通过将指定的期间规格应用于计算视图结果表时访问的所有时间表而得到的。 如果视图不访问任何临时表,则期间说明对视图的结果表没有影响。
如果表是双时间表,且未为 SYSTEM_TIME 或 BUSINESS_TIME 指定期间说明 ,则表引用包括表的所有当前行,但不包括表的历史行。
如果CURRENT TEMPORAL SYSTEM_TIME特殊寄存器被设置为非空值,则表或视图的周期说明不能引用SYSTEM_TIME。 即使视图主体未引用系统周期时间表,此限制仍然适用。 例外情况是,如果SYSTIMESENSITIVE绑定选项的生效值为NO。 在这种情况下, 周期说明可以引用 SYSTEM_TIME。
如果当前临时业务时间(CURRENT TEMPORAL BUSINESS_TIME)特殊寄存器被设置为非空值,则表或视图的周期说明不能引用业务时间(BUSINESS_TIME)。 即使视图主体未引用申请期间的时间表,此限制仍然适用。 例外情况是,如果BUSTIMESENSITIVE绑定选项的生效值为NO。 在这种情况下, 时间范围可以参考BUSINESS_TIME。
有关更多信息,请参阅:
- FOR SYSTEM_TIME
- 指定 SYSTEM_TIME 时段用于时段指定。 表引用必须是一个系统周期时间表或视图。
如果当前时间系统时间特殊寄存器的值不为空,且SYSTIMESENSITIVE绑定选项设置为YES,则不要指定FOR SYSTEM_TIME。
- FOR BUSINESS_TIME
- 指定BUSINESS_TIME时间段用于指定时间段。 表引用必须为应用程序运行期间的时间表或视图。
如果当前时间业务时间特殊寄存器的值不为空,且业务时间敏感绑定选项设置为是,则不要指定业务时间。
- AS OF 价值
指定表引用包含在值指定的时刻存在的行,如下所示: 

- 在包容性排他性时间段内,如果指定时段的开始值小于或等于值 ,且结束值大于值 ,则该时段包含在内。 如果值为空值,则表引用为空表。
- 在包容性时间段内,如果指定时段的开始值小于或等于值 ,且结束值大于或等于值 ,则该时段包含在内。 如果值为空值,则表引用为空表。

- 值
- 指定一个返回内置数据类型值的表达式。 表达的结果必须与指定期间列的数据类型相当,符合 “赋值和比较”中指定的比较规则。
表达式的时间戳精度不能高于该期间列的精度。
如果将期间的开始和结束列定义为不带时区的TIMESTAMP,则表达式不得返回带时区的TIMESTAMP值。
表达式可以包含以下任何支持的运算符:- 常量
- 专用寄存器
- 变量
- 数组元素说明
- 一个内置标量函数,其参数为支持的操作数
- CAST 规范,其中 CAST 操作数是受支持的运算数
- 使用算术运算符和操作数的表达式
视图的时期说明中不得包含未定义的参数标记。
- FROM value1 TO value2
- 指定表引用包含从 value1 至 value2。

- 在包容性-排他性期间, 如果行中的期间起始值小于 value2 ,且行中的期间结束值大于 value1。 如果 value1 大于或等于 value2 则表引用包含零行。 如果 value1 或 value2 为空值,则表引用为空表。
- 在包容性时间段内 ,如果行中的时间段起始值小于 value2 ,且行中的周期结束值大于或等于 value1。 如果 value1 大于或等于 value2 , 则表引用包含零行。 如果 value1 或 value2 为空值,则表引用为空表。

- value1 或者 value2
- 指定一个返回内置数据类型值的表达式。 表达的结果必须与指定期间列的数据类型相当,符合 “赋值和比较”中指定的比较规则。
表达式的时间戳精度不能高于该期间列的精度。
如果将期间的开始和结束列定义为不带时区的TIMESTAMP,则表达式不得返回带时区的TIMESTAMP值。
表达式可以包含以下任何支持的运算符:- 常量
- 专用寄存器
- 变量
- 数组元素说明
- 一个内置标量函数,其参数为支持的操作数
- CAST 规范,其中 CAST 操作数是受支持的运算数
- 使用算术运算符和操作数的表达式
视图的时期说明中不得包含未定义的参数标记。
- BETWEEN value1 AND value2
- 指定表引用包含指定时间段在任何时间点与 value1 和 value2。

- 在包容性-排他性期间, 如果行中的期间起始值小于或等于 value2 且行中的周期结束值大于 value1。 如果 value1 大于 value2 , 则表引用包含零行。 如果 value1 = value2 ,则表达式等效于AS OF value1。 如果 value1 或 value2 为空值,则表引用为空表。
- 在包容性时间段内 ,如果行中的时间段起始值小于或等于 value2 且行中的周期结束值大于或等于 value1。 如果 value1 大于 value2 , 则表引用包含零行。 如果 value1 = value2 ,则表达式等效于AS OF value1。 如果 value1 或 value2 为空值,则表引用为空表。

- value1 或者 value2
- 指定一个返回内置数据类型值的表达式。 表达的结果必须与指定期间列的数据类型相当,符合 “赋值和比较”中指定的比较规则。
表达式的时间戳精度不能高于该期间列的精度。
如果将期间的开始和结束列定义为不带时区的TIMESTAMP,则表达式不得返回带时区的TIMESTAMP值。
表达式可以包含以下任何支持的运算符:- 常量
- 专用寄存器
- 变量
- 数组元素说明
- 一个内置标量函数,其参数为支持的操作数
- CAST 规范,其中 CAST 操作数是受支持的运算数
- 使用算术运算符和操作数的表达式
视图的时期说明中不得包含未定义的参数标记。
注意
- 表格参考中的相关参考:
- 一般来说,嵌套表表达式和表函数可以在任何 FROM 子句中指定。 嵌套表表达式和表函数的列可以在选择列表和完整选择列表的其余部分中使用相关名称进行引用。 此关联名称的作用域与 FROM 子句中其他表或视图名称的关联名称的作用域相同。 适用于这两种情况的基本规则是,相关引用必须来自子查询层次结构中更高级别的表引用。
嵌套表表达式可以用来代替视图,以避免在不需要使用视图时创建视图。 当结果表基于宿主变量时,也可以使用它们。
对于表格功能,还有一项附加功能。 如果被引用的表在 FROM 子句中按从左到右的顺序排列在引用之前,则表函数可以包含对同一 FROM 子句中其他表的一个或多个相关引用。 如果指定可选关键字TABLE,嵌套表表达式也具有相同的能力;否则,只允许引用子查询层次结构中的更高级别。
嵌套表表达式或表函数,包含对同一 FROM 子句中其他表的关联引用:
- 不能参与完全外部连接或右外部连接
- 如果引用表在 FROM 子句中从左到右的顺序早于引用,则可以参与 LEFT OUTER JOIN 或 INNER JOIN
下表显示了一些有效和无效的相关参考示例。 TABF1 和 代表表格函数。 TABF2表 1. 相关参考资料 子选择 有效 原因 SELECT T.C1, Z.C5 FROM TABLE( TABF1(T.C2) ) AS Z, T WHERE T.C3 = Z.C4;False T.C2无法解决,因为 在FROM中不位于 之前TTABF1SELECT T.C1, Z.C5 FROM T, TABLE( TABF1(T.C2) ) AS Z WHERE T.C3 = Z.C4;是 T在FROM中,它出现在 之前,使 为人所知。TABF1T.C2SELECT A.C1, B.C5 FROM TABLE( TABF2(B.C2) ) AS A, TABLE( TABF1(A.C6) ) AS B WHERE A.C3 = B.C4;False B无法解析 ,因为解析它的表函数 在 FROM 中引用了B.C2TABF1TABF2SELECT D.DEPTNO, D.DEPTNAME, EMPINFO.AVGSAL, EMPINFO.EMPCOUNT FROM DEPT D, (SELECT AVG(E.SALARY) AS AVGSAL, COUNT(*) AS EMPCOUNT FROM EMP E WHERE E.WORKDEPT = D.DEPTNO) AS EMPINFO;False DEPT在嵌套表表达式之前,但未指定关键字TABLE,导致 未知D.DEPTNOSELECT D.DEPTNO, D.DEPTNAME, EMPINFO.AVGSAL, EMPINFO.EMPCOUNT FROM DEPT D, TABLE (SELECT AVG(E.SALARY) AS AVGSAL, COUNT(*) AS EMPCOUNT FROM EMP E WHERE E.WORKDEPT = D.DEPTNO) AS EMPINFO;是 DEPT在嵌套表表达式和关键字TABLE之前指定,使 为已知D.DEPTNO - 特殊登记的影响:
- 当前时间业务时间(CURRENT TEMPORAL BUSINESS_TIME)和当前时间系统时间(CURRENT TEMPORAL SYSTEM_TIME)特殊寄存器的设置可能会影响查询结果,具体如下:
- 假设以下条件:
- 表格参考是申请期间的时间表。
- BUSINESS_TIME 期间的列定义为 TIMESTAMP(6)。
- 当前临时业务_时间特殊寄存器被设置为非空值。
FOR BUSINESS_TIME AS OF CURRENT TEMPORAL BUSINESS_TIME - 假设以下条件:
- 表格参考是申请期间的时间表。
- BUSINESS_TIME 期间的列定义为 DATE。
- 当前临时业务_时间特殊寄存器被设置为非空值。
FOR BUSINESS_TIME AS OF CAST(CURRENT TEMPORAL BUSINESS_TIME AS DATE) - 如果当前时间系统_时间特殊寄存器被设置为非空值,则查询的执行方式与包含以下说明的查询相同:
FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME
- 假设以下条件:
