轉載自:http://blog.csdn.net/feier7501/article/details/21815691
創建表,初始化數據;
- CREATE TABLE TB_COMPANY
- (
- COMPANY_ID INTEGER PRIMARY KEY,
- COMPANY VARCHAR2(256),
- UP_COMPANYID INTEGER
- );
- INSERT INTO TB_COMPANY VALUES (0, '總公司', NULL);
- INSERT INTO TB_COMPANY VALUES (1, '北京分公司', 0);
- INSERT INTO TB_COMPANY VALUES (2, '上海分公司', 0);
- INSERT INTO TB_COMPANY VALUES (3, '海淀區分部', 1);
- INSERT INTO TB_COMPANY VALUES (4, '東城區分部', 1);
- INSERT INTO TB_COMPANY VALUES (5, '黃埔區分部', 2);
- INSERT INTO TB_COMPANY VALUES (6, '靜安區分部', 2);
- COMMIT;
CREATE TABLE TB_COMPANY
(
COMPANY_ID INTEGER PRIMARY KEY,
COMPANY VARCHAR2(256),
UP_COMPANYID INTEGER
);
INSERT INTO TB_COMPANY VALUES (0, '總公司', NULL);
INSERT INTO TB_COMPANY VALUES (1, '北京分公司', 0);
INSERT INTO TB_COMPANY VALUES (2, '上海分公司', 0);
INSERT INTO TB_COMPANY VALUES (3, '海淀區分部', 1);
INSERT INTO TB_COMPANY VALUES (4, '東城區分部', 1);
INSERT INTO TB_COMPANY VALUES (5, '黃埔區分部', 2);
INSERT INTO TB_COMPANY VALUES (6, '靜安區分部', 2);
COMMIT;
全部數據:
遞歸查詢SQL:
- SELECT (RPAD(' ', 2*(LEVEL-1), '-' ) || COMPANY) COMPANY_NAME, CONNECT_BY_ROOT COMPANY, CONNECT_BY_ISLEAF, LEVEL , SYS_CONNECT_BY_PATH(COMPANY, '/')
- FROM TB_COMPANY
- START WITH UP_COMPANYID IS NULL
- CONNECT BY PRIOR COMPANY_ID = UP_COMPANYID;
SELECT (RPAD(' ', 2*(LEVEL-1), '-' ) || COMPANY) COMPANY_NAME, CONNECT_BY_ROOT COMPANY, CONNECT_BY_ISLEAF, LEVEL , SYS_CONNECT_BY_PATH(COMPANY, '/')
FROM TB_COMPANY
START WITH UP_COMPANYID IS NULL
CONNECT BY PRIOR COMPANY_ID = UP_COMPANYID;
結果:
說明:
1. CONNECT_BY_ROOT 返回當前節點的最頂端節點
2. CONNECT_BY_ISLEAF 判斷是否爲葉子節點,如果這個節點下面有子節點,則不爲葉子節點
3. LEVEL 僞列表示節點深度
4. SYS_CONNECT_BY_PATH函數顯示詳細路徑,並用“/”分隔
遞歸查詢SQL:
- SELECT * FROM TB_COMPANY START WITH COMPANY_ID = 1 CONNECT BY PRIOR COMPANY_ID = UP_COMPANYID;
SELECT * FROM TB_COMPANY START WITH COMPANY_ID = 1 CONNECT BY PRIOR COMPANY_ID = UP_COMPANYID;
結果: