新聞中心
層次查詢(Hierarchical Query)是一種具有特殊功能的查詢語句,通過它能夠?qū)⒎謱訑?shù)據(jù)按照層次關(guān)系展示出來。分層數(shù)據(jù)是指關(guān)系表中的數(shù)據(jù)之間具有層次關(guān)系。這種關(guān)系在現(xiàn)實生活中十分常見,例如:

成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),成都做網(wǎng)站公司-成都創(chuàng)新互聯(lián)公司已向上1000家企業(yè)提供了,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)絡(luò)營銷等服務(wù)!設(shè)計與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗,合理的價格為您打造企業(yè)品質(zhì)網(wǎng)站。
組織架構(gòu)中組長和組員之間的關(guān)系。
企業(yè)中上下級部門之間的關(guān)系。
Web 網(wǎng)頁中,頁面跳轉(zhuǎn)的關(guān)系。
語法
SELECT [level], column, expr... FROM table [WHERE condition] [ START WITH start_expression ]
CONNECT BY [NOCYCLE] { PRIOR child_expr = parent_expr | parent_expr = PRIOR child_expr }
[ ORDER SIBLINGS BY …] [ GROUP BY … ] [ HAVING … ] [ ORDER BY … ]參數(shù)
|
參數(shù) |
說明 |
|---|---|
|
CONNECT_BY_ISLEAF |
當前數(shù)據(jù)行是否是層次關(guān)系中的葉子節(jié)點,是偽列,0表示不是,1表示是。 |
|
CONNECT_BY_ISCYCLE |
當前數(shù)據(jù)行是否在循環(huán)中,是偽列,0表示不是,1表示是。 |
|
CONNECT_BY_ROOT運算符 |
CONNECT_BY_ROOT是一元運算符,表示參數(shù)中的列來自于層次查詢的根節(jié)點,與一元的 + 和 - 具有相同的優(yōu)先級。 |
PRIOR 是一元運算符,表示參數(shù)中的列來自于父行(Parent row),與一元的 + 和 - 具有相同的優(yōu)先級。 | |
執(zhí)行流程
使用和實現(xiàn)層次查詢最關(guān)鍵是要理解其執(zhí)行流程,層次查詢執(zhí)行流程:
執(zhí)行
FROM后面的SCAN或JOIN操作;根據(jù)
START WITH和CONNECT BY的內(nèi)容生成層次關(guān)系結(jié)果;按照常規(guī)查詢執(zhí)行流程執(zhí)行剩下的子句(例如
WHERE、GROUP、ORDER BY......)對于 2 中生成層次關(guān)系的流程可以理解為:根據(jù)
START WITH中的表達式得到根行(Root rows)。根據(jù)
CONNECT BY中的表達式 選擇每個根行(Root rows)的子行(Child rows)。將 2 中生成的子行(Child rows)作為新的根行(Root rows)進一步生成子行(Child rows),周而復(fù)始直到?jīng)]有新行生成。
示例
展示層次查詢的使用,向表 emp中的 emp_id、position 和 mgr_id 列插入數(shù)據(jù)。執(zhí)行以下語句:
CREATE TABLE emp(emp_id INT,position VARCHAR(50),mgr_id INT);
INSERT INTO emp VALUES (1,'全球經(jīng)理',NULL);
INSERT INTO emp VALUES (2,'歐洲區(qū)經(jīng)理',1);
INSERT INTO emp VALUES (3,'亞太區(qū)經(jīng)理',1);
INSERT INTO emp VALUES (4,'美洲區(qū)經(jīng)理',1);
INSERT INTO emp VALUES (5,'意大利區(qū)經(jīng)理',2);
INSERT INTO emp VALUES (6,'法國區(qū)經(jīng)理',2);
INSERT INTO emp VALUES (7,'中國區(qū)經(jīng)理',3);
INSERT INTO emp VALUES (8,'韓國區(qū)經(jīng)理',3);
INSERT INTO emp VALUES (9,'日本區(qū)經(jīng)理',3);
INSERT INTO emp VALUES (10,'美國區(qū)經(jīng)理',4);
INSERT INTO emp VALUES (11,'加拿大區(qū)經(jīng)理',4);
INSERT INTO emp VALUES (12,'北京區(qū)經(jīng)理',7);通過上面的內(nèi)容可以看見列 position 具有清晰的層次關(guān)系。樹狀結(jié)構(gòu)如下:
是按照層次結(jié)構(gòu)將結(jié)果展示出來,執(zhí)行以下語句:
SELECT emp_id, mgr_id, position, level FROM emp
START WITH mgr_id IS NULL CONNECT BY PRIOR emp_id = mgr_id;查詢結(jié)果如下:
+--------+--------+-------------------+-------+
| EMP_ID | MGR_ID | POSITION | LEVEL |
+--------+--------+-------------------+-------+
| 1 | NULL| 全球經(jīng)理 | 1 |
| 2 | 1 | 歐洲區(qū)經(jīng)理 | 2 |
| 5 | 2 | 意大利區(qū)經(jīng)理 | 3 |
| 6 | 2 | 法國區(qū)經(jīng)理 | 3 |
| 3 | 1 | 亞太區(qū)經(jīng)理 | 2 |
| 7 | 3 | 中國區(qū)經(jīng)理 | 3 |
| 12 | 7 | 北京區(qū)經(jīng)理 | 4 |
| 8 | 3 | 韓國區(qū)經(jīng)理 | 3 |
| 9 | 3 | 日本區(qū)經(jīng)理 | 3 |
| 4 | 1 | 美洲區(qū)經(jīng)理 | 2 |
| 10 | 4 | 美國區(qū)經(jīng)理 | 3 |
| 11 | 4 | 加拿大區(qū)經(jīng)理 | 3 |
+--------+--------+-------------------+-------+如果僅查詢“亞太區(qū)”的層次結(jié)構(gòu),執(zhí)行以下語句:
SELECT emp_id, mgr_id, position, level FROM emp START WITH position = '亞太區(qū)經(jīng)理' CONNECT BY PRIOR emp_id = mgr_id;查詢結(jié)果如下:
+--------+--------+----------------+-------+
| EMP_ID | MGR_ID | POSITION | LEVEL |
+--------+--------+----------------+-------+
| 3 | 1 | 亞太區(qū)經(jīng)理 | 1 |
| 7 | 3 | 中國區(qū)經(jīng)理 | 2 |
| 12 | 7 | 北京區(qū)經(jīng)理 | 3 |
| 8 | 3 | 韓國區(qū)經(jīng)理 | 2 |
| 9 | 3 | 日本區(qū)經(jīng)理 | 2 |
+--------+--------+----------------+-------+ 分享標題:創(chuàng)新互聯(lián)OceanBase教程:OceanBase 層次查詢
當前網(wǎng)址:http://www.5511xx.com/article/ccocjcc.html


咨詢
建站咨詢
