经过前两章节基础sql脚本的讲解想必读者都学会了基础的sql语法和sql使用了。这一章节我们着重讲解些比较常见复杂的sql脚本。例如下sql:
select * from mytable3 r start with r.resc_id = '1001' connect by nocycle prior r.resc_id = r.parent_resc_id;
select * from mytable3 r start with r.resc_id = '1001' connect by nocycle prior r.parent_resc_id = r.resc_id;
上面的sql就是典型的树形查询语句。把两句sql最后面的resc_id和parent_resc_id换下位置后查出来的结果和表达的意思就会完全不同。这两条sql都是通过start with子句和connect by子句组成。它先通过start with确定起始记录行,然后再根据已查到的起始记录行结合 connect by 子句进行树形递归查找。例如上面第二条语句先通过start with确定resc_id = ‘1001’这条记录,然后根据这条记录的parent_resc_id 的值去关联其它记录中的resc_id 的值。只要start with确定的记录的parent_resc_id 的值和其他记录的 resc_id 的值相等。就把相关联的记录做为结果集查找出来。找到这些关联记录后,又根据这些关联记录的parent_resc_id 的值继续去关联其它记录中的resc_id 的值,如此循环反复,只要两值相等,就都作为最终的查询结果集。最后一层一层查询出所有符合条件的记录。结合截图举例,有这么一个菜单表,表里总共有这些菜单数据。如下图:

看下面的sql
select * from mytable3 r start with r.resc_id = '10010102' connect by nocycle prior r.parent_resc_id = r.resc_id ;
该条sql查询的结果如下图

来分析下这个查询结果。首先根据start with r.resc_id = '10010102' 确定起始查询记录行,该行的id=15,它会做为最终结果集的一部分。然后根据这条id=15的记录的parent_resc_id 的值去寻找表中其它行和字段resc_id 的值相等的记录,找到了id=5的这条记录。然后又根据id=5的这条记录的parent_resc_id 的值去寻找表中字段resc_id 的值和该值相等的记录,最后又找到了id=1的表记录。然后还会根据id=1的记录的parent_resc_id 的值去寻找表中字段resc_id 的值等于100的记录。因为表中确实没有resc_id=100的记录,最后sql递归寻找结束,并返回我们需要的正确结果集。这条语句是从‘树枝往树根寻找’。
再看下面这条sql:
select * from mytable3 r start with r.resc_id = '1001' connect by nocycle prior r.resc_id = r.parent_resc_id;
&n

最低0.47元/天 解锁文章


被折叠的 条评论
为什么被折叠?



