层次查询(Hierarchical Query)是一种具有特殊功能的查询语句,通过它能够将分层数据按照层次关系展示出来。分层数据是指关系表中的数据之间具有层次关系。这种关系在现实生活中十分常见,例如:
成都网站设计、网站建设、外贸网站建设,成都做网站公司-成都创新互联公司已向上1000家企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。
组织架构中组长和组员之间的关系。
企业中上下级部门之间的关系。
Web 网页中,页面跳转的关系。
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 … ]
参数 |
说明 |
---|---|
CONNECT_BY_ISLEAF |
当前数据行是否是层次关系中的叶子节点,是伪列,0表示不是,1表示是。 |
CONNECT_BY_ISCYCLE |
当前数据行是否在循环中,是伪列,0表示不是,1表示是。 |
CONNECT_BY_ROOT运算符 |
CONNECT_BY_ROOT是一元运算符,表示参数中的列来自于层次查询的根节点,与一元的 + 和 - 具有相同的优先级。 |
PRIOR 是一元运算符,表示参数中的列来自于父行(Parent row),与一元的 + 和 - 具有相同的优先级。 | |
使用和实现层次查询最关键是要理解其执行流程,层次查询执行流程:
执行 FROM
后面的 SCAN
或 JOIN
操作;
根据 START WITH
和 CONNECT BY
的内容生成层次关系结果;
按照常规查询执行流程执行剩下的子句(例如 WHERE
、GROUP
、ORDER BY
......)对于 2 中生成层次关系的流程可以理解为:
根据 START WITH
中的表达式得到根行(Root rows)。
根据 CONNECT BY
中的表达式 选择每个根行(Root rows)的子行(Child rows)。
将 2 中生成的子行(Child rows)作为新的根行(Root rows)进一步生成子行(Child rows),周而复始直到没有新行生成。
展示层次查询的使用,向表 emp中的 emp_id、position 和 mgr_id 列插入数据。执行以下语句:
CREATE TABLE emp(emp_id INT,position VARCHAR(50),mgr_id INT);
INSERT INTO emp VALUES (1,'全球经理',NULL);
INSERT INTO emp VALUES (2,'欧洲区经理',1);
INSERT INTO emp VALUES (3,'亚太区经理',1);
INSERT INTO emp VALUES (4,'美洲区经理',1);
INSERT INTO emp VALUES (5,'意大利区经理',2);
INSERT INTO emp VALUES (6,'法国区经理',2);
INSERT INTO emp VALUES (7,'中国区经理',3);
INSERT INTO emp VALUES (8,'韩国区经理',3);
INSERT INTO emp VALUES (9,'日本区经理',3);
INSERT INTO emp VALUES (10,'美国区经理',4);
INSERT INTO emp VALUES (11,'加拿大区经理',4);
INSERT INTO emp VALUES (12,'北京区经理',7);
通过上面的内容可以看见列 position 具有清晰的层次关系。树状结构如下:
是按照层次结构将结果展示出来,执行以下语句:
SELECT emp_id, mgr_id, position, level FROM emp
START WITH mgr_id IS NULL CONNECT BY PRIOR emp_id = mgr_id;
查询结果如下:
+--------+--------+-------------------+-------+
| EMP_ID | MGR_ID | POSITION | LEVEL |
+--------+--------+-------------------+-------+
| 1 | NULL| 全球经理 | 1 |
| 2 | 1 | 欧洲区经理 | 2 |
| 5 | 2 | 意大利区经理 | 3 |
| 6 | 2 | 法国区经理 | 3 |
| 3 | 1 | 亚太区经理 | 2 |
| 7 | 3 | 中国区经理 | 3 |
| 12 | 7 | 北京区经理 | 4 |
| 8 | 3 | 韩国区经理 | 3 |
| 9 | 3 | 日本区经理 | 3 |
| 4 | 1 | 美洲区经理 | 2 |
| 10 | 4 | 美国区经理 | 3 |
| 11 | 4 | 加拿大区经理 | 3 |
+--------+--------+-------------------+-------+
如果仅查询“亚太区”的层次结构,执行以下语句:
SELECT emp_id, mgr_id, position, level FROM emp START WITH position = '亚太区经理' CONNECT BY PRIOR emp_id = mgr_id;
查询结果如下:
+--------+--------+----------------+-------+
| EMP_ID | MGR_ID | POSITION | LEVEL |
+--------+--------+----------------+-------+
| 3 | 1 | 亚太区经理 | 1 |
| 7 | 3 | 中国区经理 | 2 |
| 12 | 7 | 北京区经理 | 3 |
| 8 | 3 | 韩国区经理 | 2 |
| 9 | 3 | 日本区经理 | 2 |
+--------+--------+----------------+-------+
新闻标题:创新互联OceanBase教程:OceanBase 层次查询
网页地址:http://www.gawzjz.com/qtweb2/news30/3930.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联