

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# CONNECT BY 子句
<a name="r_CONNECT_BY_clause"></a>

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

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

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

1. 对 CONNECT BY 子句求值。

1. 对 WHERE 子句求值。

## 语法
<a name="r_CONNECT_BY_clause-synopsis"></a>

```
[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'
```

## 参数
<a name="r_CONNECT_BY_parameters"></a>

 *start\$1with\$1conditions*   
指定层次结构根行的条件

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

```
PRIOR column = expression
-- or
expression > PRIOR column
```

## 运算符
<a name="r_CONNECT_BY_operators"></a>

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

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

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

## 示例
<a name="r_CONNECT_BY_example"></a>

以下示例是 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 所在部门的组织结构图。\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/images/org-chart.png)
