對於任何給定行,其父級和子級均由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)