使用postgre資料庫實現樹形結構表的子-父級迭代查詢,通過級聯選單簡單舉例
前言:開發常用的關係型資料庫mysql,mssql,postgre,oracle,簡單的增刪改查的SQL語句都與標準SQL相容,這個不用講,那麼對於迭代查詢(不嚴格的叫法:遞迴查詢)每種資料庫都不一樣,對於標準SQL語句支援最好的是mssql和postgre,這個不需多講,我們只講講單表情況下的postgre如何通過迭代查詢獲取有層級關係的資料。
一、表結構舉例
MENU表
IDVARCHAR2(32) N
sys_guid() 節點id
FENXIDVARCHAR2(32) Y
分項id
FENXMCVARCHAR2(100)
FUJIDVARCHAR2(32) Y
父級id
FUJMCVARCHAR2(100)
Y 父級名稱
二、關聯關係
子級選單的FUJID等於父級選單的FENXID,根節點沒有FUJID,每個節點都有一個節點ID用於方便單個節點增刪改查
即((根節點,根節點無FUJID)ID,FENXID-->FUJID,FENXID(具有子級的父節點,該FUJD等於上一級的FENXID)-->FUJID,FENXID-->FUJID,FENXID-->FUJID,FENXID....以此類推)
三、迭代查詢
(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
查詢結果的每條資料會帶一個loclevel欄位,該欄位表示層級
(2)限制層級數量查詢
比如,我們只需要查詢到第三級選單,在上面的SQL語句中增加一個loclevel<3的條件:
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