Oracle兼容之层次查询:层次查询高级特性分析
2008-09-04 12:50:44 来源:WEB开发网WHERE语句不进行特殊的处理,以所有表的笛卡儿集为层次查询的对象,然后将WHERE语句作为过滤层次查询后的过滤条件。
对WHERE语句中的逻辑表达式进行处理,根据相应的策略将where语句中的一部分逻辑表达式作为连接条件下放的层次查询下层的连接中去。这样的话层次查询的直接对象是以连接条件选择的笛卡儿集的一部分数据。而余下的逻辑表达式继续作为过滤条件对层次查询的结果集进行过滤。
也就是对例如 select * from t1,t2 where t1.f1=t2.c1 connect by prior t1.f1=t1.f2这样的语句。决定层次查询的直接对象到底是t1×t2 还是σt1.f1=t2.c1(t1×t2)的问题。下面利用如下数据就WHERE语句逻辑表达式的各种情况对Oracle的实现进行研究。
表t1:
Droptablet1;
Createtablet1(aint,pint,cint);
Insertintot1values(0,0,1);
Insertintot1values(0,1,11);
Insertintot1values(0,11,111);
Insertintot1values(1,0,1);
Insertintot1values(1,1,11);
Insertintot1values(1,11,111);
表t2:
Droptablet2;
Createtablet2(aint);
Insertintot2values(0);
Insertintot2values(1);
简单情况1
利用如下语句来分析当WHERE所有子逻辑表达式都只涉及一个表的情况。
语句1:
Selectlevel,
sys_connect_by_path(t2.a,'/')path_a2,
sys_connect_by_path(t1.a,'/')path_a1,
sys_connect_by_path(p,'/')path_p,
sys_connect_by_path(c,'/')path_c,t2.a,t1.a,p,c
fromt1,t2
wheret1.a=1
connectbypriorc=p
startwithp=0andt1.a=1andt2.a=0;
更多精彩
赞助商链接