指定された行の親ノードと子ノードは、CONNECT by句によって決定されます。 CONNECT BY 句は、等号 (=) 演算子と比較して、2 つの式で構成する必要があります。 これら 2 つの式のいずれかは、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は子オブジェクトのIDを示し、parentidは親オブジェクトのIDを示し、nameは子オブジェクトの名前を示します。
データを挿入します。
- 浙江省のデータを挿入します。
INSERT INTO chinamap VALUES(1、NULL、'Zhejiang'); - 浙江省の県レベルの都市のデータを挿入します。
INSERT INTO chinamap VALUES(101、1、'Hangzhou'); INSERT INTO chinamap VALUES(102、1、'Ningbo '); INSERT INTO chinamap VALUES(103、1、'Wenzhou'); INSERT INTO chinamap VALUES(104、1、'Jiaxing'); INSERT INTO chinamap VALUES(105、1、'Huzhou'); INSERT INTO chinamap VALUES(106、1、'Shaoxing'); チャイナマップ値に挿入 (107、1、'Jinhua'); INSERT INTO chinamap VALUES(108、1、'Quzhou'); INSERT INTO chinamap VALUES(109、1、'Zhoushan'); INSERT INTO chinamap VALUES(110、1、'Taizhou'); INSERT INTO chinamap VALUES(111、1、'Lishui'); - 杭州地区のデータを挿入します。
chinamap VALUES(10101、101、「Shangcheng」) に挿入します。INSERT INTO chinamap VALUES(10102、101、'Xiacheng '); INSERT INTO chinamap VALUES(10103、101、'Xihu'); chinamap VALUES(10104、101、'Gongshu') に挿入します。chinamap VALUES(10105、101、「Yuhang」) に挿入します。INSERT INTO chinamap VALUES(10106、101、'Binjiang'); chinamap VALUES(10107、101、'Jianggan') に挿入します。INSERT INTO chinamap VALUES(10108、101、'Xiaoshan');
都市階層を照会します。
select * from chinamap start with id = 1 connect by parentid=previous id; 同様の出力が表示されます: id | parentid | name
------ ---------- ------------
1 | | 浙江省
101 | 1 | 杭州
10101 | 101 | Shangcheng
10102 | 101 | Xiacheng
10103 | 101 | Xihu
10104 | 101 | Gongshu
10105 | 101 | Yuhang
10106 | 101 | Binjiang
10107 | 101 | Jianggan
10108 | 101 | Xiaoshan
102 | 1 | 寧波
103 | 1 | 温州
104 | 1 | Jiaxing
105 | 1 | 湖州
106 | 1 | Shaoxing
107 | 1 | Jinhua
108 | 1 | Quzhou
109 | 1 | 舟山
110 | 1 | 泰州
111 | 1 | Lishui
(20行)