问关于爱丽丝仓鼠笼
爱丽丝
-
水泥脑袋
oracle中connect by.start with.的使用
一、语法
大致写法:select*from some_table[where 条件1]connect by[条件2]start with[条件3];其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。[where 条件1]、[条件2]、[条件3]各自作用的范围都不相同:
[where 条件1]是在根据“connect by[条件2]start with[条件3]”选择出来的记录中进行过滤,是针对单条记录的过滤,不会考虑树的结构;[条件2]指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉;[条件3]限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件;示例:
假如有如下结构的表:some_table(id,p_id,name),其中p_id保存父记录的id。select*from some_table t where t.id!123 connect by prior t.p_id=t.id and t.p_id!321 start with t.p_id=33 or t.p_id=66;对prior的说明:
prior存在于[条件2]中,可以不要,不要的时候只能查找到符合“start with[条件3]”的记录,不会在寻找这些记录的子节点。要的时候有两种写法:connect by prior t.p_id=t.id 或 connect by t.p_id=prior t.id,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上的搜索方式(先找叶子节点然后找父节点)。二、执行原理
connect by.start with.的执行原理可以用以下一段程序的执行以及对存储过程recurse()的调用来说明:
遍历表中的每条记录,对比是否满足start with后的条件,如果不满足则继续下一条,
如果满足则以该记录为根节点,然后调用recurse()递归寻找该节点下的子节点,
如此循环直到遍历完整个表的所有记录。for rec in(select*from some_table)loop
if fullfills_start_with_condition(rec)then
recurse(rec,rec.child);end if;end loop;寻找子节点的存储过程*/
procedure recurse(rec in matches_select_stmt,new_parent in field_type)**
begin
append_result_l**t(rec);把记录加入结果集合中*/
再次遍历表中的所有记录,对比是否满足connect by后的条件,如果不满足则继续下一条,
如果满足则再以该记录为根节点,然后调用recurse()继续递归寻找该节点下的子节点,
如此循环直到找至叶子节点。for rec_recurse in(select*from some_table)loop
if fullfills_connect_by_condition(rec_recurse.child,new_parent)then
recurse(rec_recurse,rec_recurse.child);end if;end loop;end procedure recurse;三、使用探讨
从上面的执行原理可以看到“connect by.start with.”构造树的方式是:(1)如果是自上而下方式,则把表中的每一条记录都作为根节点来生成树,所以表中有多少条记录就会构造出多少棵树。(2)如果是自下而上的搜索方式,则把表中的每一条记录都作为叶子节点来生成分支,所以表中有多少条记录就会生成多少条分支。因此如果表中的记录不是严格遵照每条记录都只能有一个父记录的原则,那么就可能有部分记录会存在于多棵树中,那么在查找记录的时候就可能会出现找到多条重复记录的异常情况
1.hierarchical queries:start with and connect by prior clauses
hierarchical queries
start with and connect by prior clauses.
select employee_id,manager_id,first_name,last_name
from employee_jh
start with employee_id=1
connect by prior employee_id=manager_id;employee_id manager_id first_name last_name
1 0 james smith
2 1 ron johnson
3 2 fred hobbs
5 2 rob green
4 1 susan jones
6 4 jane brown
9 6 henry heyson
7 4 john grey
8 7 jean blue
10 1 kevin black
11 10 keith long
12 10 frank howard
13 10 doreen penn
13 rows selected.
2.using a subquery in a start with clause
select level,
lpad(' ',2*level-1)|first_name|' '|last_name as employee
from employee_jh
start with employee_id=(select employee_id from employee_jh where first_name='kevin' and last_name='black')
connect by prior employee_id=manager_id;level employee
1 kevin black
2 keith long
2 frank howard
2 doreen penn
3.including other conditions in a hierarchical query
select level,
lpad(' ',2*level-1)|first_name|' '|
last_name as employee,salary
from employee_jh
where salary
start with employee_id=1
connect by prior employee_id=manager_id;level employee salary
3 rob green 40000
3 jane brown 45000
4 henry heyson 30000
3 john grey 30000
4 jean blue 29000
3 keith long 50000
3 frank howard 45000
3 doreen penn 47000
8 rows selected.
-
问 爱丽丝机甲玩法攻略大全 爱丽丝机甲有哪些玩法
提问时间:2024-05-16 21:52:31
答 经验副本攻略经验副本推荐打第三个,30级的,图一,然后我们打完一局差不多一分钟,我是48-52秒(图二),大家视情况而定,会得到1-3不等个经验贝壳,差不多是一...
-
问 关于爱丽丝梦游仙境各个版本
提问时间:2024-05-16 23:52:00
答 展开全部[编辑本段]四.迷你剧《爱丽丝梦游仙境》(2009年版)1.基本信息中文名:爱丽丝梦游仙境alice英文名称:alice别名:爱丽丝集数:2集类
-
问 nds爱丽丝学园攻略
提问时间:2024-05-16 08:35:13
答 我已经玩通关两次了。有什么问题可以问我哈~总是的来说还是很简单的第一次选择有危险预知、千里眼、调和、体力四种,建议多次选择务必达到危险预知,这样就不用买危险贴布...
-
问 清潭洞爱丽丝
提问时间:2024-05-16 02:41:03
答 黄启昌,**新一代人气配音演员。2012《玛丽外宿中》李安《爱情睡醒了》项天骐《city hunter》李允成2013《爱情上错身》徐允载《美乐加油》韩
-
问 旅行青蛙仓鼠照片怎么收集 仓鼠喜爱物品一览
提问时间:2024-05-16 07:40:21
答 哈哈.看到了你的问题后让我不由的回想到了,前两年我也有养过仓鼠的经历!说实话还蛮有趣的那是我养的是两只,可惜在4个月大的时候其中一只不幸离开了!结果剩下来的那只...
-
问 求bloody alice热血爱丽丝第五十关攻略
提问时间:2024-05-16 19:15:52
答 我过的时候 用老鼠拖延时间 卡攻击刷新 就是敌人举起武器的时候 冲上去砍 然后立刻跑回来 无伤近战攻击 攒老头和火车 另一个特技用锤子 老鼠除了刷新快还有一个好...
-
问 关于dnf爱丽丝的问题。
提问时间:2024-05-16 22:07:15
答 80马上就要出了,楼主说的确实对,就是第2使徒赫尔德指示她做的,关于使徒转移问题是她想借冒险家的力量来削弱使徒。韩服巴卡儿已经漂白,赫尔德会越描越黑,具体国服开...