CONNECT BY 子句 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

CONNECT BY 子句

CONNECT BY 子句指定层次结构中行之间的关系。您可以使用 CONNECT BY 按层次结构顺序选择行,方法是将表联接到表本身并处理分层数据。例如,您可以使用它以递归方式循环浏览组织结构图和列出数据。

分层查询按以下顺序处理:

  1. 如果 FROM 子句有联接,则首先对其进行处理。

  2. 对 CONNECT BY 子句求值。

  3. 对 WHERE 子句求值。

语法

[START WITH start_with_conditions] CONNECT BY connect_by_conditions
注意

虽然 START 和 CONNECT 不是保留字,但如果您在查询中使用 START 和 CONNECT 作为表别名,请使用分隔标识符(双引号)或 AS,以避免在运行时失败。

SELECT COUNT(*) FROM Employee "start" CONNECT BY PRIOR id = manager_id START WITH name = 'John'
SELECT COUNT(*) FROM Employee AS start CONNECT BY PRIOR id = manager_id START WITH name = 'John'

参数

start_with_conditions

指定层次结构根行的条件

connect_by_conditions

指定层次结构的父行和子行之间关系的条件。必须使用用于引用父行的 一元运算符限定至少一个条件。

PRIOR column = expression -- or expression > PRIOR column

运算符

您可以在 CONNECT BY 查询中使用以下运算符。

LEVEL

返回层次结构中当前行级别的伪列。为根行返回 1,为根行的子行返回 2,依此类推。

PRIOR

一元运算符,用于计算层次结构中当前行的父行的表达式。

示例

以下示例是 CONNECT BY 查询,该示例返回直接或间接向 John 报告的员工数量,不超过 4 个级别。

SELECT id, name, manager_id FROM employee WHERE LEVEL < 4 START WITH name = 'John' CONNECT BY PRIOR id = manager_id;

以下是查询的结果。

id name manager_id ------+----------+-------------- 101 John 100 102 Jorge 101 103 Kwaku 101 110 Liu 101 201 Sofía 102 106 Mateo 102 110 Nikki 103 104 Paulo 103 105 Richard 103 120 Saanvi 104 200 Shirley 104 205 Zhang 104

此示例的表定义:

CREATE TABLE employee ( id INT, name VARCHAR(20), manager_id INT );

以下是插入到表中的行。

INSERT INTO employee(id, name, manager_id) VALUES (100, 'Carlos', null), (101, 'John', 100), (102, 'Jorge', 101), (103, 'Kwaku', 101), (110, 'Liu', 101), (106, 'Mateo', 102), (110, 'Nikki', 103), (104, 'Paulo', 103), (105, 'Richard', 103), (120, 'Saanvi', 104), (200, 'Shirley', 104), (201, 'Sofía', 102), (205, 'Zhang', 104);

以下是 John 所在部门的组织结构图。

John 所在部门的组织结构图。