层级子句对表对象上的递归查询设置条件,在该表对象的行之中,存在父子依赖的层级。包括此子句的 SELECT 语句称为层级查询。
必须在 SELECT 语句的 FROM 子句中指定在其上进行层级查询操作的表对象。该表对象通常是自引用表,在其中一个或多个列作为同一表中另一列(或这些列的子集)的外键约束。
层级查询对若干行进行操作,在其中一个或多个列值对应于父子关系的逻辑结构之内的节点。如果父行有多个孩子,则在同一父母的孩子行之中存在兄弟关系。例如,这些关系可能反映一个组织的部门和管理级别之内的员工与管理者之中的报告结构。
此子句支持的语法是对 SQL 的 ANSI/ISO 标准的扩展。
GBase 8s 支持在层级查询的 projection 列表中的序列对象,在 WHERE 子句中,以及在表达式在 SELECT 语句中为有效的其他上下文中,但不在层级查询子句中。
在相关联的子查询和在不相关联的子查询中,层级子句是无效的。
层级查询不支持 GBase 8s 的“并行数据库查询”(PDQ)特性。
此运算符可为其运算对象的根祖先返回一表达式。
此运算符可引用从前一递归步骤返回的值(此处的“步骤”是指该递归查询的一次迭代)。
此伪列返回一整数,指示该层级之内递归查询的哪一步骤返回了行。
此伪列可指示一行是否有一个还是其祖先的孩子。
此伪列可指示一行在查询返回的行之中是否有任何的孩子。
此函数可构建和返回一字符串,该字符串表示从指定的行到层级的根的路径
ORDER SIBLINGS BY 子句可对返回的每个级别的同一父母的兄弟行进行排序。
伪列是在特定的上下文中 SQL 解析器可识别的内建的标识符,共享同一命名空间作为列和变量。通常在 SELECT 语句的 Projection 子句中指定这些伪列和 SYS_CONNECT_BY_PATH 函数,但可在层级子句中指定 LEVEL 伪列和 PRIOR 运算符。
要获取仅支持层级查询的这些令牌的语法和语义的详细信息,请参阅 在 CONNECT BY 子句中的条件 和 ORDER SIBLINGS BY 子句。
ORDER BY 子句的 ORDER BY SIBLING 选项可对同一父母的孩子行的集合进行排序。
包括层级子句的子查询按部分的顺序返回中间结果集,在此,特定层级的迭代(n+1)中产生的行紧跟在产生它们的迭代(n)中的行之后。然而,ORDER BY 子句、GROUP BY 或 HAVING 子句,或在 Projection 子句中指定的 DISTINCT 或 UNIQUE 关键字会销毁那部分的顺序。
层级子句跟在 SELECT 语句子句的词汇序列中的 WHERE 子句之后,但在该层级子句的结果上处理 WHERE 子句断言。如果 SELECT 语句包括层级子句,则 WHERE 子句不可指定连接子句,但在 FROM 子句中指定的表对象可作为连接一个或多个表的查询的结果集。
在 START WITH 和 CONNECT BY 子句返回所有中间的结果集之后,您可使用 ORDER SIBLINGS BY 子句来对该层级之内的每个级别的有相同的父母的兄弟行进行排序。要获取更多信息,请参阅 ORDER SIBLINGS BY 子句。
您可使用来自 SET EXPLAIN 语句的输出来查看层级查询的执行路径。
层级子句提供一种有效的替代机制,使用节点数据库扩展来从层级数据集检索信息
在接下来的几个主题中,那些展示层级查询的 SQL 代码示例是基于下列 employee 表中的层级数据,其行包含关于在组织的层级之内的员工的信息。mgrid 列展示员工向其汇报的管理者的员工标识符(empid):
CREATE TABLE employee( empid INTEGER NOT NULL PRIMARY KEY, name VARCHAR(10), salary DECIMAL(9, 2), mgrid INTEGER );
employee 表中 17 行的数据值如下。
INSERT INTO employee VALUES ( 1, 'Jones', 30000, 10); INSERT INTO employee VALUES ( 2, 'Hall', 35000, 10); INSERT INTO employee VALUES ( 3, 'Kim', 40000, 10); INSERT INTO employee VALUES ( 4, 'Lindsay', 38000, 10); INSERT INTO employee VALUES ( 5, 'McKeough', 42000, 11); INSERT INTO employee VALUES ( 6, 'Barnes', 41000, 11); INSERT INTO employee VALUES ( 7, 'O''Neil', 36000, 12); INSERT INTO employee VALUES ( 8, 'Smith', 34000, 12); INSERT INTO employee VALUES ( 9, 'Shoeman', 33000, 12); INSERT INTO employee VALUES (10, 'Monroe', 50000, 15); INSERT INTO employee VALUES (11, 'Zander', 52000, 16); INSERT INTO employee VALUES (12, 'Henry', 51000, 16); INSERT INTO employee VALUES (13, 'Aaron', 54000, 15); INSERT INTO employee VALUES (14, 'Scott', 53000, 16); INSERT INTO employee VALUES (15, 'Mills', 70000, 17); INSERT INTO employee VALUES (16, 'Goyal', 80000, 17); INSERT INTO employee VALUES (17, 'Urbassek', 95000, NULL);
每一 empid 与 mgrid 值对表达引用的关系,带有适当的 CONNECT BY 条件的查询的递归迭代可正确地组装成层级。
在此,最后一行中 mgrid 列中的 NULL 值展示其 empid 值为 17 的员工 Urbassek 是此报告层级的根节点。
下图展示 employee 表数据的报告层级(以展示 empid 值的节点)的四个级别:
图: 在报告层级中的元素的关系