日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle表分层,sql – 对非分层数据的Oracle分层查询

發(fā)布時(shí)間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle表分层,sql – 对非分层数据的Oracle分层查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我將一個(gè)Oracle表中的數(shù)據(jù)組織成可以包含循環(huán)的圖(參見示例).

CREATE TABLE T (parent INTEGER,child INTEGER)

AS select 1 parent,2 child from dual

union all select 1 parent,8 child from dual

union all select 2 parent,3 child from dual

union all select 2 parent,4 child from dual

union all select 2 parent,8 child from dual

union all select 3 parent,4 child from dual

union all select 3 parent,6 child from dual

union all select 4 parent,5 child from dual

union all select 5 parent,8 child from dual

union all select 6 parent,5 child from dual

union all select 7 parent,3 child from dual

union all select 7 parent,5 child from dual

union all select 8 parent,6 child from dual

我的目標(biāo)是獲得節(jié)點(diǎn)X的所有后代(孩子,孩子的孩子等)的節(jié)點(diǎn).假設(shè)2.我的預(yù)期結(jié)果是:3,4,5,6,8.

我知道我可以設(shè)計(jì)一個(gè)這樣的查詢:

SELECT child,sys_connect_by_path(child,'/')

FROM T

START WITH parent = 2

CONNECT BY NOCYCLE PRIOR child = PARENT;

這樣一個(gè)查詢的問(wèn)題是,它會(huì)遍歷所有可能的路徑,直到它們循環(huán),并且在我的實(shí)際數(shù)據(jù)中有太多的路徑.結(jié)果包括許多重復(fù) – 這里是:

child | sys_connect_by_path (for information)

3 | /3

4 | /3/4

5 | /3/4/5

8 | /3/4/5/8

6 | /3/4/5/8/6

6 | /3/6

5 | /3/6/5

8 | /3/6/5/8

4 | /4

5 | /4/5

8 | /4/5/8

6 | /4/5/8/6

8 | /8

6 | /8/6

5 | /8/6/5

我的實(shí)際數(shù)據(jù)要復(fù)雜得多.這樣的查詢的執(zhí)行成本是如此巨大,使得我的TEMP表空間(可自動(dòng)擴(kuò)展)達(dá)到10Gb(最初為500Mb),并且由于磁盤已滿,我的數(shù)據(jù)庫(kù)實(shí)際上被破壞.

我試圖設(shè)計(jì)這樣的查詢(遞歸WITH子句):

WITH descendants(node) AS

( SELECT 2 node FROM dual

UNION ALL

(

SELECT child

FROM T

INNER JOIN descendants D

ON T.parent = D.node

MINUS SELECT node FROM descendants

)

)

SELECT * FROM descendants

我遇到的問(wèn)題是:

>使用Oracle 10g,這沒(méi)有實(shí)現(xiàn)(ORA-32033:不支持的列別名,一些客戶使用Oracle 9或10)

>使用Oracle 11g,我得到ORA-32041:遞歸WITH子句中的UNION ALL操作必須只有兩個(gè)分支.如果我刪除了MINUS子句,我將獲得循環(huán)(ORA-32044:在執(zhí)行遞歸WITH查詢時(shí)檢測(cè)到循環(huán)).

您如何查詢我的原始數(shù)據(jù)以有效地獲得這些節(jié)點(diǎn)3,8? PL / sql解決方案也受到歡迎.

謝謝.

總結(jié)

以上是生活随笔為你收集整理的oracle表分层,sql – 对非分层数据的Oracle分层查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。