列名限定符和列名的解析
列名限定符的解析规则适用于包含子查询的每个 SQL 语句,并在解析同义词和别名之前应用。
FROM子句中的名称要么公开 ,要么不公开。 表名、视图名、嵌套表表达式或表函数引用的关联名称始终是公开的。 没有关联名称的表名或视图名也会被公开。
尽管 Db2 for z/OS® 没有严格执行这一规则,但在 IBM® SQL和ANSI/ISO SQL中,FROM子句中的暴露名称必须是唯一的,列名的限定符必须是暴露名称。 因此,为了实现良好的编程实践,请确保所有暴露的名称都是唯一的,并且所有合格的列名都使用适当的暴露名称进行限定。
查找列名限定符所指对象的规则如下:
- 假设Q是一个由一到三个部分组成的名称, Q.C 表示子选择S中的列名。 Q 必须指定语句中包含 S 的表或视图,且该表或视图必须包含名为 C 的列。 两种情况下的附加要求有所不同:
- 如果 Q.C 不在搜索条件中或者 S 不是子查询,则 Q 必须指定 S 的 FROM 子句中标识的表或视图。 例如,如果 Q.C 出现在SELECT子句中,则Q指的是以下FROM子句中的表或视图。
- 如果 Q.C 处于搜索条件中并且 S 是子查询,则 Q 必须指定在 S 的 FROM 子句中或直接或间接包含 S 的子选择的 FROM 子句中标识的表或视图。 例如,如果 Q.C 在WHERE子句中,且S是语句中唯一的子查询,则Q所引用的表或视图要么在S的FROM子句中,要么在包含S的子查询的FROM子句中。
- 同一语句中可以多次识别同一表格或视图。 Q 引用的表格或视图的具体出现由一个等同于以下步骤的过程决定:
- 每个 FROM 子句中的单字节和双字节名称以及列名称的单字节和双字节限定符都会扩展为完全限定形式。
例如,如果动态 SQL 语句使用 FROM Q,并且 DYNAMICRULES 运行行为(RUN)生效,则 Q 会扩展为 S.A.Q ,其中 S 是 CURRENT SERVER 的值,A 是 CURRENT SCHEMA 的值。 (如果动态规则约束行为生效,则A是绑定过程中确定的计划或包限定符,或者是定义过程时确定的本机SQL过程的限定符。) 这一步后来被称为
命名完成
。 如果每个名字的第一部分(位置)不同,则会发生错误。 - Q,现在是一个由三个部分组成的名称,与S中FROM子句中的每个名称进行比较。 如果 Q.C 处于搜索状态 ,且S是一个子查询,则Q与包含S的子查询的FROM子句中的每个名称进行比较。 如果子选择是一个子查询,则将Q与包含该子查询的子选择的FROM子句中的每个名称进行比较,依此类推。 如果 FROM 子句包含多个名称,则该子句中的比较将从左到右依次进行。
- Q的指代物由以下规则选择:
- 如果Q与某个名字完全匹配,则选择该名字。
- 如果Q匹配多个名字,但只有一个暴露的名字,则选择该暴露的名字。
- 如果Q匹配多个公开姓名,则选择第一个。
- 如果Q匹配多个名字,且这些名字都不是公开名字,则选择第一个名字。
如果Q与任何名称不匹配,或者Q指定的表或视图没有包含名为C的列,则会发生错误。
- 否则, Q.C 将解析为选定名称所标识的表格或视图的 C 列。
- 每个 FROM 子句中的单字节和双字节名称以及列名称的单字节和双字节限定符都会扩展为完全限定形式。
- 出现以下情况时,系统会发出警告:
- 所选名称不是暴露名称。
- 所选名称是一个公开名称,其未公开副本在Q所比较的名称排序列表中位于所选名称之前。
- 所选名称是一个暴露名称,在同一个 FROM 子句中有一个暴露的重复。
- 如果在命名完成之前进行匹配,则会选择另一个名字。
列名限定符的解析规则适用于包含子查询的每个 SQL 语句,并在解析同义词和别名之前应用。 在搜索UPDATE或DELETE语句或MERGE语句时,语句的第一个子句用于标识要更改的表或视图。 该子句可以包含关联名称,在名称解析方面,它等同于 SELECT 语句的第一个 FROM 子句。 例如,UPDATE语句的搜索条件中的子查询可以包含对更新行列的相关引用。
ORDER BY子句中的列名规则与其他子句相同。