对于任何给定行,其父级和子级均由CONNECTBY子句确定。CONNECT BY子句必须由使用等号 (=) 进行比较的两个表达式组成。此外,这两个表达式之一必须前面带有关键字PRIOR。

对于任何给定行,要确定其子级,请执行以下操作:

  1. 对给定行计算parent_expr。
  2. 对计算table_expression所得的任何其他行计算child_expr。
  3. 如果parent_expr = child_expr,则该行就是给定父行的子节点。
  4. 对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)