没有高并发,亿万级数据优化的sql脚本三

        经过前两章节基础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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangzewu1

谢谢您的鼓励,一分钱都是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值