全部產品
Search
文件中心

PolarDB:定義父/子關係

更新時間:Jul 06, 2024

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