
# StartWith Operator
#### 算子说明
层次查询算子，用于执行递归查询操作。层次查询的执行流程是：
- 由START WITH区域的条件选择初始的数据集，把初始的数据集设为工作集。
- 只要工作集不为空，会用工作集的数据作为输入，查询下一轮的数据，过滤条件由CONNECT BY区域指定。其中，PRIOR关键字表示当前记录。
- 把步骤2中筛选出来的数据集，设为工作集，返回第二步重复操作。
同时，数据库为每一条选出来的数据添加下述的伪列，方便用户了解数据在递归或者树状结构中的位置。可以根据CONNECT BY中的条件，建立对应的索引，来提高START WITH语句的性能。
#### 典型场景
使用层次查询。
#### 示例
**示例：**使用层次查询。
```
--数据准备。 
gaussdb=# CREATE TABLE area (id INT,name VARCHAR(25),parent_id INT);
CREATE TABLE
gaussdb=# INSERT INTO area VALUES (1,'中国',NULL);
INSERT 0 1
gaussdb=# INSERT INTO area VALUES (2,'北京市',1);
INSERT 0 1
gaussdb=# INSERT INTO area VALUES (3,'朝阳区',2);
INSERT 0 1
gaussdb=# INSERT INTO area VALUES (4,'陕西省',1);
INSERT 0 1
gaussdb=# INSERT INTO area VALUES (5,'西安市',4);
INSERT 0 1
gaussdb=# INSERT INTO area VALUES (6,'雁塔区',5);
INSERT 0 1
gaussdb=# INSERT INTO area VALUES (7,'未央区',5);
INSERT 0 1 
--执行结果。 
gaussdb=# EXPLAIN SELECT level, name FROM area START WITH (id = 1) CONNECT BY PRIOR id = parent_id;
                                        QUERY PLAN                                        
------------------------------------------------------------------------------------------
 CTE Scan on tmp_reuslt  (cost=294.67..295.55 rows=44 width=72)
   CTE tmp_reuslt
     ->  StartWith Operator  (cost=0.00..294.67 rows=44 width=76)
           Start With pseudo atts: array_key_1
           ->  Recursive Union  (cost=0.00..294.67 rows=44 width=76)
                 ->  Seq Scan on area  (cost=0.00..19.64 rows=4 width=76)
                       Filter: (id = 1)
                 ->  Hash Join  (cost=27.35..27.42 rows=4 width=76)
                       Hash Cond: (tmp_reuslt.id = public.area.parent_id)
                       ->  WorkTable Scan on tmp_reuslt  (cost=0.00..0.02 rows=1 width=4)
                       ->  Hash  (cost=17.71..17.71 rows=771 width=76)
                             ->  Seq Scan on area  (cost=0.00..17.71 rows=771 width=76)
(12 rows)
--删除。
gaussdb=# DROP TABLE area;
```
上述示例中，StartWith算子输出信息如下所示。
| 信息名称                   | 含义                                                                       |
|:---|:---|
| StartWith              | 算子的名称。                                                                   |
| Start With pseudo atts | 递归的关键列号。Start With pseudo atts: array_key_1表示被prior标记的条件是原表的第1列，以此列进行递归。 |
   
