使用Oracle數據庫實現樹形結構表的子-父級迭代(遞歸)查詢和刪除,通過級聯菜單簡單舉例
- 2019 年 11 月 1 日
- 筆記
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/eguid_1/article/details/54667008
前言:
我們在開發中,常常遇到單表的子-父id級聯的表結構,在樹形的深度不確定的情況下,一次查詢出某個樹形結構下的所有具有子-父級關係的數據變得十分困難。
這時,我們使用oracle提供的CONNECT BY PRIOR … start WITH 實現樹形結構具有子父級關係的表迭代查詢和刪除就會很方便。
1、樹形結構表舉例
(1)假設有一個MENU表,該表結構如下:
ID VARCHAR2(32) N sys_guid() 節點id FENXID VARCHAR2(32) Y 分項id FENXMC VARCHAR2(100) Y 分項名稱 FUJIDVARCHAR2(32) Y 父級id FUJMCVARCHAR2(100) Y 父級名稱
(2)表的關聯關係如下:
子級菜單的FUJID等於父級菜單的FENXID,根節點沒有FUJID,每個節點都有一個節點ID用於方便單個節點增刪改查
即((根節點,根節點無FUJID)ID,FENXID–>FUJID,FENXID(具有子級的父節點,該FUJD等於上一級的FENXID)–>FUJID,FENXID–>FUJID,FENXID–>FUJID,FENXID….以此類推)
2、樹形表查詢
根據指定的ID查詢該ID下面所有子-父級關係的數據
SELECT ID,level FROM MENU CONNECT BY PRIOR FENXID = FUJID start WITH ID = '402881cd59bbceb70159bbcefbdd0001'
這樣就會根據父級ID遞歸列出了該ID下面所有具有子父級關係的數據
補充:level,用於顯示第幾層
3、樹形表刪除
刪除單個節點就不解釋了,直接根據對應ID刪除即可
刪除某個節點下面所有具有子父級關係的數據SQL語句如下:
delete from MENU where ID in( SELECT ID FROM MENU CONNECT BY PRIOR FENXID = FUJID start WITH ID = '402881cd59bbceb70159bbcefbdd0001' )
實現方式就是先遞歸查詢出所有具有子父級關係的數據,然後刪除查詢到的數據即可