最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle樹形查詢CONNECT BY雙向遍歷實(shí)戰(zhàn)指南

 更新時(shí)間:2026年05月19日 09:22:04   作者:【JAVA】玩家  
本文介紹了Oracle數(shù)據(jù)庫(kù)的CONNECTBY語(yǔ)法在處理樹形數(shù)據(jù)(如菜單、組織架構(gòu)等方面的應(yīng)用,詳述了父向子、子向向兩種遍歷方式的實(shí)現(xiàn),并法及其條件設(shè)置,并提供了適用于MySQL/PostgreSQL的替代方案,總結(jié)了使用過(guò)程中的注意事項(xiàng),并給出了Java調(diào)用示例,感興趣的朋友一起看看吧

?? 適用數(shù)據(jù)庫(kù)說(shuō)明:

  • Oracle:原生支持 CONNECT BY 語(yǔ)法,是處理樹形數(shù)據(jù)的標(biāo)準(zhǔn)方案。
  • 達(dá)夢(mèng)數(shù)據(jù)庫(kù)(DM):完全兼容 Oracle 的 CONNECT BY 語(yǔ)法,可直接使用本文所有示例。
  • MySQL / PostgreSQL:不支持 CONNECT BY,請(qǐng)使用 WITH RECURSIVE(公共表表達(dá)式)實(shí)現(xiàn)類似功能。

一、場(chǎng)景說(shuō)明

處理菜單 / 組織架構(gòu)等樹形數(shù)據(jù)時(shí),Oracle CONNECT BY 可實(shí)現(xiàn)向上、向下兩種遞歸遍歷,無(wú)需復(fù)雜存儲(chǔ)過(guò)程。

二、核心 SQL 實(shí)戰(zhàn)

1. 父→子向下遍歷(查所有子節(jié)點(diǎn))

select distinct
    m.menu_id,
    m.parent_id,
    m1.menu_name as parent_name,
    m.menu_name,
    m.menu_abbreviation,
    m.display_location,
    m.path,
    m.icon,
    m.order_num,
    m.menu_type,
    m.is_frame
from auth_sys_menu m
left join auth_sys_menu m1 on m.parent_id = m1.menu_id
start with m.menu_id in ('13')---這里填父級(jí)菜單
connect by prior m.menu_id = m.parent_id
order by m.parent_id, m.order_num;

效果返回指定父節(jié)點(diǎn)下所有子菜單(含多級(jí)后代),用于菜單批量授權(quán)、樹形展開。

2. 子→父向上遍歷(查所有父節(jié)點(diǎn))

select distinct
    m.menu_id,
    m.parent_id,
    m1.menu_name as parent_name,
    m.menu_name,
    m.menu_abbreviation,
    m.display_location,
    m.path,
    m.icon,
    m.order_num,
    m.menu_type,
    m.is_frame
from auth_sys_menu m
left join auth_sys_menu m1 on m.parent_id = m1.menu_id
start with m.menu_id in ('1024')----這里填寫子菜單
connect by prior m.parent_id = m.menu_id
order by m.parent_id, m.order_num;

效果返回指定子節(jié)點(diǎn)的所有上級(jí)節(jié)點(diǎn)(含根節(jié)點(diǎn)),用于面包屑導(dǎo)航、權(quán)限繼承校驗(yàn)。## 三、關(guān)鍵語(yǔ)法對(duì)比

遍歷方向CONNECT BY 條件核心作用
父→子PRIOR m.menu_id = m.parent_id查所有后代節(jié)點(diǎn)
子→父PRIOR m.parent_id = m.menu_id查所有祖先節(jié)點(diǎn)

四、避坑要點(diǎn)

  • DISTINCT:層級(jí)查詢易出現(xiàn)重復(fù)數(shù)據(jù),需去重。
  • START WITH:支持 IN 傳入多個(gè)起始節(jié)點(diǎn),實(shí)現(xiàn)多分支遍歷。
  • ORDER BY:配合 order_num 保證菜單展示順序。

五、Java 調(diào)用示例(MyBatis)

<select id="listChildMenus" resultType="com.xxx.vo.MenuVO">
    select distinct
        m.menu_id,
        m.parent_id,
        m1.menu_name as parent_name,
        m.menu_name,
        m.path,
        m.icon
    from auth_sys_menu m
    left join auth_sys_menu m1 on m.parent_id = m1.menu_id
    start with m.menu_id in (#{menuId})
    connect by prior m.menu_id = m.parent_id
    order by m.parent_id, m.order_num
</select>

六、總結(jié)

CONNECT BY 是 Oracle 處理樹形數(shù)據(jù)的高效方案,掌握兩種遍歷方式可覆蓋大部分業(yè)務(wù)場(chǎng)景。通過(guò)調(diào)整 PRIOR 的位置,即可輕松實(shí)現(xiàn)向上、向下兩種遍歷,覆蓋絕大多數(shù)菜單、組織架構(gòu)等業(yè)務(wù)場(chǎng)景。

到此這篇關(guān)于Oracle樹形查詢CONNECT BY雙向遍歷實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Oracle CONNECT BY雙向遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

通城县| 福州市| 沿河| 青海省| 都江堰市| 雷山县| 承德县| 宁津县| 蒙自县| 海宁市| 石城县| 新余市| 武汉市| 香格里拉县| 枣庄市| 绥宁县| 荆州市| 金山区| 文安县| 西丰县| 晋中市| 贵德县| 博乐市| 江安县| 沈丘县| 新巴尔虎右旗| 寻乌县| 昌黎县| 奉节县| 盐津县| 扎囊县| 道孚县| 香港 | 安国市| 微山县| 松滋市| 永修县| 旬邑县| 鄢陵县| 钟山县| 辽宁省|