在db2和oracle中的對樹的遞迴查詢語句。
表結構:
create table main_node (
mla_id integer not null , //節點id
mla_rootid integer, //根節點id
mla_parentid integer, //父節點id
mla_name varchar2(50), //節點名稱
constraint p_mlaid primary key (mla_id) );
mla_id mla_parentid mla_rootid mla_name
1 0 0 父節點1
2 1 0 (父節點1的/)子節點1
3 2 0 (父節點1的/子節點1的/)孫子節點1
4 0 0 父節點2
5 4 0 (父節點2的/)子節點1
樹結構直觀圖:
根節點(0)
父節點1(1)
(父節點1的/)子節點1(2)
(父節點1的/子節點1的/)孫子節點1(3)
父節點2(4)
(父節點2的/)子節點1(5)
語句要求的功能:實現給出乙個父節點id然後得到該父節點下的所有子節點的資訊db2 的查詢語句:
with rpl (mla_parentid, mla_id, mla_name) as
(
select root.mla_parentid, root.mla_id, root.mla_name from main_node root where root.mla_id = ?
union all
select child.mla_parentid, child.mla_id, child.mla_name from rpl parent, main_node child where parent.mla_parentid = child.mla_id
)
select distinct mla_parentid, mla_id, mla_name from rpl order by mla_parentid, mla_id, mla_name
讓我們研究這個查詢語句:
oracle的查詢語句:
select mla_parentid, mla_id, mla_name from main_node
start with mla_id=? connect by prior mla_id=mla_parentid
讓我們研究這個查詢語句:
db2查詢樹寫法
較oracle來說,db2的查詢樹寫法比較複雜,但是當你習慣以後,其實寫法也挺簡單的。db2要自己寫遞迴,沒有提供相應的函式 create table tree 例子 with rpl treesuperid,treeid,treename,level as select root.treesupe...
DB2中的高效查詢
1 確保在連線謂詞中使用等號 2 同時應盡可能使用not exists來代替not in,儘管二者都使用了not 不能使用索引而降低速度 not exists要比not in查詢效率更高。索引而降低速度 not exists要比not in查詢效率更高。3 同時應盡可能使用exists來代替in,儘...
DB2遞迴查詢
遞迴 sql 在 db2 中通過公共表表示式 cte,common table expression 來實現。遞迴 sql 由遞迴 cte 以及對遞迴 cte 結果的查詢組成。那什麼是遞迴 cte 呢?簡言之,如果 cte 中的 fullselect 在 from 子句中引用到 cte 本身,就是遞...