深入理解connect by rownum

2021-09-08 20:26:37 字數 1865 閱讀 9668

connect by中的條件就表示了父子之間的連線關係

比如 connect by id=prior pid

但如果connect by中的條件沒有表示記錄之間的父子關係(如 connect by裡沒有 id=prior pid)

那會出現什麼情況?

常見的,connect by會在構造序列的時候使用。

用select rownum from dual connect by rownum我們注意到,dual是乙個只有一條記錄的表,如果表有多條記錄,將會怎樣?

--建表

create table aaa(id varchar2(1));

--插入資料

insert into aaa (id) values ('a');

insert into aaa (id) values ('b');

insert into aaa (id) values ('c');

查詢一:

select id,level from aaa connect by level<2;
結果:

i level

a 1b 1

c 1查詢二:

select id,level from aaa connect by level<3;
i level

a 1

a 2b 2

c 2b 1

a 2b 2

c 2c 1

a 2b 2

c 2查詢三:

select id,level from aaa connect by level<4;
結果:

i level

a 1

a 2a 3

b 3c 3

b 2a 3

b 3c 3

c 2a 3

b 3c 3

b 1

a 2a 3

b 3c 3

b 2a 3

b 3c 3

c 2a 3

b 3c 3

c 1

a 2a 3

b 3c 3

b 2a 3

b 3c 3

c 2a 3

b 3c 3

下圖為select id,level from aaa connect by level<4時遞迴查詢到的樹狀結構:

由上圖,可以得出規律如下:

n+n的二次方+。。。。。+n的level次方

其中,n表示表中有n條記錄,level表示上述樹狀圖中的樹的層數,也就是指connect by 子句中的level偽列(或是rownum偽列)值。

樹每增加一層,則n+n的二次方+。。。。。+n的level+1次方=n+n*(n+n的二次方+。。。。。+n的level次方)。

於是可以總結出

f(n,l)=∑power(n,p), p取值為[1,l),即level=1時,power(3,1)=3 level=2時,power(3,2)=9,即12-3,level=3時,power(3,3)=27,即39-12。

從而得出如下結論:

假設表中有n條記錄,則記f(n,l)為select id,level from t connect by level注釋:

當連線條件(connect by條件)沒有限制記錄之間的關係(即 connect by裡沒有類似 id=prior pid的條件,而是 connect by rownum這就是oracle採用了深度優先的演算法。

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...