在項目中使用z-tree這種形式的插件時,往往表結構也是樹杈型,及一個表中既包含自己的id,又包含父級id,可以無限遞歸下去,這種結構使用起來非常方便,易於拓展,但是同時帶來節點遞歸查詢的問題,幸運的是oracle提供了此類查詢的標準sql公式,記錄一下,以便使用!
公式
SELECT LEVEL,t.*
FROM 表名 T
--這裏的level是指根據下面指定的方向的層次,本體爲第一級
[WHERE LEVEL= '2']
--開始查詢的條件,一般爲某條記錄的id=?
START WITH T.ORG_ID = 28
-- 這裏會向緊跟着PRIOR後面的第一個參數的方向查詢,可以控制向後查詢子集和向前查詢父集
-- id = 父級id,向下查詢
--CONNECT BY PRIOR T.ORG_ID = T.F_ID
-- 父級id = 本條id 向上查詢
CONNECT BY PRIOR 父級id = 本條記錄id
-- WHERE 條件3
ORDER BY LEVEL;
數據庫語句
- 創建測試用戶 test1024
-- Create the user
create user test1024
identified by test1024
default tablespace USERS
temporary tablespace TEMP;
-- Grant/Revoke role privileges
grant connect to test1024;
grant resource to test1024;
-- Set the user's default roles
alter user test1024
default role connect, resource;
- 創建表
-- Create table
create table org
(
id number not null,
name varchar2(50) not null,
fid number not null
)
;
-- Add comments to the columns
comment on column org.id
is 'id';
comment on column org.name
is '名稱';
comment on column org.fid
is '父級id';
- 插入數據
insert into ORG (ID, NAME, FID)
values (1, '中國', 0);
insert into ORG (ID, NAME, FID)
values (2, '江蘇', 1);
insert into ORG (ID, NAME, FID)
values (3, '徐州', 2);
insert into ORG (ID, NAME, FID)
values (4, '南京', 2);
insert into ORG (ID, NAME, FID)
values (5, '上海', 1);
insert into ORG (ID, NAME, FID)
values (6, '雨花臺區', 4);
insert into ORG (ID, NAME, FID)
values (7, '泉山區', 3);
insert into ORG (ID, NAME, FID)
values (8, '日本', 0);
insert into ORG (ID, NAME, FID)
values (9, '東京', 8);
insert into ORG (ID, NAME, FID)
values (10, '名古屋', 8);
insert into ORG (ID, NAME, FID)
values (11, '大阪', 8);
insert into ORG (ID, NAME, FID)
values (12, '大田區', 9);
示例
表 org
表字段 | 含義 |
---|---|
id | 主鍵id |
name | 名稱 |
fid | 父級id |
- 向上級查詢所有上級
SELECT LEVEL,t.*
FROM org t
START WITH T.ID = 12
-- 這裏會向緊跟着PRIOR後面的第一個參數的方向查詢,可以控制向後查詢子集和向前查詢父集
CONNECT BY PRIOR T.FID = T.ID
-- WHERE 條件3
ORDER BY LEVEL;
- 向下級查詢所有下級
SELECT LEVEL,t.*
FROM org t
START WITH T.ID = 1
-- 這裏會向緊跟着PRIOR後面的第一個參數的方向查詢,可以控制向後查詢子集和向前查詢父集
CONNECT BY PRIOR T.ID = T.FID
-- WHERE 條件3
ORDER BY LEVEL;