本文共 2471 字,大约阅读时间需要 8 分钟。
SYS_CONNECT_BY_PATH 是 Oracle 数据库中一个强大的工具,主要用于在 SQL 查询中构建层级路径信息。它可以将父节点及其子节点通过指定的连接符连接起来,便于展示组织架构或其他层级结构。
SYS_CONNECT_BY_PATH 函数的主要语法格式如下:
SELECT substr(SYS_CONNECT_BY_PATH(tb.name, '-', '>'), 3) name2 FROM table tb3 START WITH nvl(tb.parentid, 0) = 4 CONNECT BY PRIOR ID = mt.parentid;
:),否则会导致 Oracle 报错。推荐使用 - 作为连接符。replace 函数替换,例如 replace(name, ',', '-')。创建表格 SC_DISTRICT 以存储组织架构信息:
CREATE TABLE SC_DISTRICT ( ID NUMBER(10) NOT NULL, PARENT_ID NUMBER(10), NAME VARCHAR2(255 BYTE) NOT NULL);
插入多级组织架构数据:
INSERT INTO SC_DISTRICT (ID, NAME) VALUES (1, '四川省');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (2, 1, '巴中市');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (3, 1, '达州市');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (4, 2, '巴州区');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (5, 2, '通江县');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (6, 2, '平昌县');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (7, 3, '通川区');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (8, 3, '宣汉县');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (9, 8, '塔河乡');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (10, 8, '三河乡');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (11, 8, '胡家镇');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (12, 8, '南坝镇');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (13, 6, '大寨乡');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (14, 6, '响滩镇');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (15, 6, '龙岗镇');INSERT INTO SC_DISTRICT (ID, PARENT_ID, NAME) VALUES (16, 6, '白衣镇');
通过以下 SQL 查询可以获取巴中市及其下属组织的层级路径:
SELECT ID, NAME, PARENT_ID, substr(SYS_CONNECT_BY_PATH(NAME, '-', '>'), 3) NAME_PATHFROM SC_DISTRICTSTART WITH NAME = '巴中市'CONNECT BY PRIOR ID = PARENT_ID;
查询输出如下:
| ID | NAME | PARENT_ID | NAME_PATH |
|---|---|---|---|
| 2 | 巴中市 | 1 | 巴中市 |
| 4 | 巴州区 | 2 | 巴中市->巴州区 |
| 5 | 通江县 | 2 | 巴中市->通江县 |
| 6 | 平昌县 | 2 | 巴中市->平昌县 |
| 13 | 大寨乡 | 6 | 巴中市->平昌县->大寨乡 |
| 14 | 响滩镇 | 6 | 巴中市->平昌县->响滩镇 |
| 15 | 龙岗镇 | 6 | 巴中市->平昌县->龙岗镇 |
| 16 | 白衣镇 | 6 | 巴中市->平昌县->白衣镇 |
substr 函数限制返回的字符串长度,避免过长的路径信息。通过以上方法,可以有效地在 Oracle 数据库中构建和查询层级组织架构路径,方便信息展示和管理。
转载地址:http://kopfk.baihongyu.com/