oracle 樹結構查詢雙向遞歸查詢語句

在項目中使用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;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章