使用postgre數據庫實現樹形結構表的子-父級迭代查詢,經過級聯菜單簡單舉例

前言:開發經常使用的關係型數據庫mysql,mssql,postgre,oracle,簡單的增刪改查的SQL語句都與標準SQL兼容,這個不用講,那麼對於迭代查詢(不嚴格的叫法:遞歸查詢)每種數據庫都不同,對於標準SQL語句支持最好的是mssql和postgre,這個不需多講,咱們只講講單表狀況下的postgre如何經過迭代查詢獲取有層級關係的數據。mysql


1、表結構舉例

MENU表

ID VARCHAR2(32)     N   sys_guid()    節點id
FENXID VARCHAR2(32)      Y                       分項id
FENXMC VARCHAR2(100)    Y                       分項名稱
FUJID VARCHAR2(32)      Y                       父級id
FUJMC VARCHAR2(100)    Y                       父級名稱
sql


2、關聯關係

子級菜單的FUJID等於父級菜單的FENXID,根節點沒有FUJID,每一個節點都有一個節點ID用於方便單個節點增刪改查數據庫

即((根節點,根節點無FUJID)ID,FENXID-->FUJID,FENXID(具備子級的父節點,該FUJD等於上一級的FENXID)-->FUJID,FENXID-->FUJID,FENXID-->FUJID,FENXID....以此類推)oracle


3、迭代查詢

(1)不限層級查詢

WITH RECURSIVE locs(ID,FENXID,FENXMC,FUJID,FUJMC)
AS
(
    SELECT a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,0 AS loclevel FROM menu a
    where a.id='12345678000000000000'
UNION ALL
        SELECT  a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,loclevel+1 FROM menu a
            INNER JOIN locs p ON a.fujid=p.fenxid
 
)
SELECT * FROM locs
post

查詢結果的每條數據會帶一個loclevel字段,該字段表示層級ui


(2)限制層級數量查詢

好比,咱們只須要查詢到第三級菜單,在上面的SQL語句中增長一個loclevel<3的條件:spa

WITH RECURSIVE locs(ID,FENXID,FENXMC,FUJID,FUJMC)
AS
(
    SELECT a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,0 AS loclevel FROM menu a
    where a.id='12345678000000000000'
UNION ALL
        SELECT  a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,loclevel+1 FROM menu a
            INNER JOIN locs p ON a.fujid=p.fenxid and loclevel<3
 
)
SELECT * FROM locs
遞歸

相關文章
相關標籤/搜索