前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
我們經常會將一個比較復雜的目錄樹存儲到一個表中。或者將一些部門存儲到一個表中,而這些部門互相有隸屬關系。這個時候你就會用到connect by prior start with。oracle 提供了start with connect by 語法結構可以實現遞歸查詢。
?
connect by 是結構化查詢中用到的,其基本語法是:
select ... from tablename start with 條件1
connect by prior 條件2
where 條件3;
例:
select * from table
start with org_id = 'HBHqfWGWPy'
connect by prior org_id = parent_id;
簡單說來是將一個樹狀結構存儲在一張表里,比如一個表中存在兩個字段:
org_id,parent_id那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。
用上述語法的查詢可以取得這棵樹的所有記錄。
其中:
條件1 是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
條件2 是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR org_id = parent_id就是說上一條記錄的org_id 是本條記錄的parent_id,即本記錄的父親是上一條記錄。
條件3 是過濾條件,用于對返回的所有記錄進行過濾。
?
例如:
沒有加中start with ... connect by prior ...的查詢結果:
select t.dim_id, t.pid, level
from pmcode.pmcode_fj_tree_rl t
where t.dim_id in (select b.dim_id
? ? ? ? ? ? ? ? ? ? ? from pmcode.PMCODE_KPI_DIM_OD b
? ? ? ? ? ? ? ? ? ? ?where b.kpi_id = 'KC0011')
結果:
DIM_ID PID LEVEL
---------------------
1024 5003 0
1070 0 0
5003 1070 0
5006 0 0
------------------------------------------------------------------------------------
增加start with ... connect by prior ...以后的結果:
select t.dim_id, t.pid, level
from pmcode.pmcode_fj_tree_rl t
where t.dim_id in (select b.dim_id
? ? ? ? ? ? ? ? ? ? ? from pmcode.PMCODE_KPI_DIM_OD b
? ? ? ? ? ? ? ? ? ? ?where b.kpi_id = 'KC0011')
start with t.dim_id = '1070' ----表示從dim_id = '1070'開始(也就是說1070為根節點)
connect by prior t.dim_id = t.pid; ----表示上條記錄的dim_id等于本條記錄的pid
結果:
DIM_ID PID LEVEL
---------------------
1070 0 1
5003 1070 2
1024 5003 3
?
又如:
?
1. 一個簡單舉例:
SQL> select *??from test;
BILL_MONTH???????????DAY_NUMBER MSISDN
-------------------- ---------- --------------------
200803????????????????????????1 13800
200803????????????????????????3 13800
200803????????????????????????2 13800
200803????????????????????????2 13801
200803????????????????????????4 13804
200803????????????????????????5 13804
200803????????????????????????7 13804
200803????????????????????????8 13804
200803????????????????????????6 13802
200803????????????????????????6 13801
200803????????????????????????7 13801
200803????????????????????????8 13801
12 rows selected
SQL>
SQL> select * from test
??2???????start with day_number=1
??3???????connect by??prior day_number=day_number-1 and prior msisdn= msisdn
??4??????;
BILL_MONTH???????????DAY_NUMBER MSISDN
-------------------- ---------- --------------------
200803????????????????????????1 13800
200803????????????????????????2 13800
200803????????????????????????3 13800
SQL>
上面的語句查找出了從1開始,并且day_number 逐漸+1 遞增的,并且 msisdn 相同的哪些個數據.
2. start with??connect by 語法結構
?如上面說看到的 例子, 其語法結構為??start with condition??connect by??condition (含 prior 關鍵字)
start with conditon 給出的seed 數據的范圍, connect by??后面給出了遞歸查詢的條件,prior 關鍵字表示父數據,prior 條件表示子數據需要滿足父數據的什么條件。
在下面的這個start with connect by 結構中,就表示 查找出了從1開始,父數據的day_number等于子數據的day_number-1而且父數據的msisdn=子數據的msisdn.
start with day_number=1
?????connect by??prior day_number=day_number-1 and prior msisdn= msisdn
?
?
?
?