Oracle兼容之层次查询:层次查询高级特性分析
2008-09-04 12:50:44 来源:WEB开发网语句4可以等价于查询:select …… from (select * from t1,t2 where t1.a=t2.a or t1.a =1) where t1.a=1 connect by prior c=p start with p=0 and t1.a=1 and t2.a=0。
由or将不同类型的单个逻辑表达式连接起来的where语句,其整个语句将会作为connect by查询前的连接条件使用,而其中的涉及单个表的逻辑表达式同时又作为connect by查询之后的过滤条件使用。
综上我们可以总结一下几种简单情况下WHERE语句的处理方式。
首先将单个布尔表达式定义为两种类型。
类型1:诸如a=1的情况,单个布尔表达式最多只涉及一个表;
类型2:诸如t1.a=t2.b的情况,布尔表达式涉及两个以上的表。
相应的,由and或or等连接起来的布尔表达式子句也分为两种类型。
类型A:connect by执行后的过滤条件;
类型B:connect by执行前的连接条件。
根据之前我们的分析,可以得出Oracle层次查询中对where语句进行以下处理:
1、全部由类型1布尔表达式构成的子句,整个子句为A类型子句;
2、全部由类型2布尔表达式构成的子句,整个子句是B类型子句;
3、由and连接多个A类型子句和B类型子句构成的子句,其中所有A类型子句用and连接后为一个新的A类型子句;所有的B类型子句式用and连接后为一个新的B类型子句;
4、由or连接的A类型和B类型子句,整个子句为B类型子句;而其中所有A类型子句用or连接后成为一个新的A类型子句。
复杂的情况
之前几节分析了4中简单的情况,但是在查询时会出现更加复杂的,诸如a=b and c=d or c=1 或((a=b or b=1)and c=d )or c=1之类的由and和or共同组成的,同时单个表达式有的涉及单表有的涉及多表的情况。下面我们就层次查询应对这样的WHERE语句其进行的处理进行分析。
更多精彩
赞助商链接