对于任何给定行,其父级和子级均由CONNECTBY子句确定。CONNECT BY子句必须由使用等号 (=) 进行比较的两个表达式组成。此外,这两个表达式之一必须前面带有关键字PRIOR。
对于任何给定行,要确定其子级,请执行以下操作:
- 对给定行计算parent_expr。
 - 对计算table_expression所得的任何其他行计算child_expr。
 - 如果parent_expr = child_expr,则该行就是给定父行的子节点。
 - 对table_expression中的所有其余行重复上述过程。符合步骤3中的等式的所有行均是给定父行的子节点。
 
说明 将先对table_expression返回的每一行执行用于确定行是否为子节点的计算过程,然后才将WHERE子句应用于table_expression。
                  
               通过重复此过程,将先前步骤中找到的每个子节点视为父节点,从而构造一个倒置的节点树。当最后一组子节点没有自己的子级时,该过程便完成,这些节点是叶节点。
包含CONNECT BY子句的SELECT命令通常包含START WITH子句。
                  
                     
                     
               
               说明 START WITH子句确定要作为根节点的行,这些行是要应用前面描述的算法的初始父节点,具体请参见选择根节点。
                     
                  示例
创建城市归属表。
                        
                        
                  
                  CREATE TABLE chinamap(id INT, parentid INT, name TEXT);说明 其中,id表示对象序号,parentid表示归属的对象序号,name表示对象名称。
                        
                     插入数据。
                     
                  - 插入浙江省数据。
INSERT INTO chinamap VALUES(1, NULL, '浙江省'); - 插入浙江省地级市数据。
INSERT INTO chinamap VALUES(101, 1, '杭州市'); INSERT INTO chinamap VALUES(102, 1, '宁波市'); INSERT INTO chinamap VALUES(103, 1, '温州市'); INSERT INTO chinamap VALUES(104, 1, '嘉兴市'); INSERT INTO chinamap VALUES(105, 1, '湖州市'); INSERT INTO chinamap VALUES(106, 1, '绍兴市'); INSERT INTO chinamap VALUES(107, 1, '金华市'); INSERT INTO chinamap VALUES(108, 1, '衢州市'); INSERT INTO chinamap VALUES(109, 1, '舟山市'); INSERT INTO chinamap VALUES(110, 1, '台州市'); INSERT INTO chinamap VALUES(111, 1, '丽水市'); - 插入杭州市市辖区数据。
INSERT INTO chinamap VALUES(10101, 101, '上城区'); INSERT INTO chinamap VALUES(10102, 101, '下城区'); INSERT INTO chinamap VALUES(10103, 101, '西湖区'); INSERT INTO chinamap VALUES(10104, 101, '拱墅区'); INSERT INTO chinamap VALUES(10105, 101, '余杭区'); INSERT INTO chinamap VALUES(10106, 101, '滨江区'); INSERT INTO chinamap VALUES(10107, 101, '江干区'); INSERT INTO chinamap VALUES(10108, 101, '萧山区'); 
查询城市归属。
               select * from chinamap start with id = 1 connect by parentid = prior id;显示结果如下: id   | parentid |  name
-------+----------+--------
     1 |          | 浙江省
   101 |        1 | 杭州市
 10101 |      101 | 上城区
 10102 |      101 | 下城区
 10103 |      101 | 西湖区
 10104 |      101 | 拱墅区
 10105 |      101 | 余杭区
 10106 |      101 | 滨江区
 10107 |      101 | 江干区
 10108 |      101 | 萧山区
   102 |        1 | 宁波市
   103 |        1 | 温州市
   104 |        1 | 嘉兴市
   105 |        1 | 湖州市
   106 |        1 | 绍兴市
   107 |        1 | 金华市
   108 |        1 | 衢州市
   109 |        1 | 舟山市
   110 |        1 | 台州市
   111 |        1 | 丽水市
(20 rows)