小编给大家分享一下Oracle如何实现层次化查询,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Oracle层次化查询

(1) 树状模型

假如有一个市场模型,其中一级市场是中国,二级市场是省份,三级市场是各个省下面的市,四级市场是各个市下面的县。那么可以创建表market:

createtable market(market_id number(2), market_name varchar2(10),parent_market_id number(2));

insertall

intomarket values(1, 'China', 0)

intomarket values(2, 'Shan Xi', 1)

intomarket values(3, 'Shan Dong', 1)

intomarket values(4, 'Fu Jian', 1)

intomarket values(5, 'Tai Yuan', 2)

intomarket values(6, 'Yang Quan', 2)

intomarket values(7, 'Qi Zhou', 2)

intomarket values(8, 'Qing Dao', 3)

intomarket values(9, 'Ji Nan', 3)

intomarket values(10, 'Yan Tai', 3)

intomarket values(11, 'Xia Men', 4)

intomarket values(12, 'Fu Zhou', 4)

intomarket values(13, 'Quan Zhou', 4)

intomarket values(14, 'Gu Jiao', 5)

intomarket values(15, 'Yang Qu', 5)

intomarket values(16, 'Qing Xu', 5)

select* from dual;

(2) 层次化查询

selectmarket_id, market_name

frommarket

startwith market_name = 'Shan Xi'

connectby prior market_id = parent_market_id;

MARKET_IDMARKET_NAME

----------------------------------------

2 Shan Xi

5 Tai Yuan

14Gu Jiao

15Yang Qu

16Qing Xu

6 Yang Quan

7 Qi Zhou

7rows selected.

这里的搜索规则为:从'ShanXi'节点开始搜索、前一个节点的market_id等于下一个节点的parent_markket_id。

(3) 相关函数

显示搜索路径的函数为

sys_connect_by_path(列名,分隔符)

示例:

selectmarket_id, market_name, sys_connect_by_path(market_name, '/') asmarket_path

frommarket

startwith market_name = 'Gu Jiao'

connectby prior parent_market_id = market_id;

MARKET_IDMARKET_NAM MARKET_PATH

-------------------- ----------------------------------------

14Gu Jiao /Gu Jiao

5 Tai Yuan /Gu Jiao/Tai Yuan

2 Shan Xi /Gu Jiao/Tai Yuan/Shan Xi

1 China /Gu Jiao/Tai Yuan/Shan Xi/China

这里可以利用max()函数来获得完整的路径:

selectmax(sys_connect_by_path(market_name, '/')) market_path

frommarket

startwith market_name = 'Gu Jiao'

connectby prior parent_market_id = market_id;

MARKET_PATH

----------------------------------------

以上是“Oracle如何实现层次化查询”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!