由Oracle的start with connect by prior展开的一些想法

connect by 是结构化查询中用到的,其基本语法是:

select ... from tablename start with 条件1 
connect by 条件2 
where 条件3;

例:

select * from table
start with org_id = 'HBHqfWGWPy'
connect by prior org_id = parent_id;

简单的来说:
条件1是初始条件,即你选择什么样的节点作为树根(你可以选择多个节点作为树根,意味着你可以取多棵树);
条件2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
这就涉及了查出来的结果顺序,是由父到子,还是由子到父。
条件3 是过滤条件,用于对返回的所有记录进行过滤。(可以忽略)

好的,这不是我今天所说的重点,重点是在项目中用这样的语句,是需要承担一定的风险,因为你有可能写出一条死循环语句。为了避免这样的操作,项目中可以给需要用到树形结构的表,再另外配一张展平表,专门记录一下,每个节点的所有子节点直至叶子。虽然这样可能造成数据冗余,但可以让你在进行树形结构查询时更加安全。
例如:
你有一张机构,其大致结构是:

ID ORG_ID ORG_NAME PAR_ORG_ID ….
1 001 父机构1 ….
2 002 父机构2 ….
3 001001 子机构11 001 ….
4 001002 子机构21 001 ….
5 002001 子机构21 002 ….
6 002002001 子机构221 002001 ….

你可以再做一张其展平表,其大致结构为:

ID ORG_ID PAR_ORG_ID
1 001 001
2 001001 001
3 001002 001
4 001001 001001
5 001002 001002
6 002 002
7 002001 002
8 002002001 002
8 002001 002001
9 002002001 002001
10 002002001 002002001

就是你需要记录一个机构的所有子机构(包括子机构的子机构,以此类推),这样当你查询一个机构的所有机构时,以这张展平表作为主表,再到机构表去取更加详细的信息。
至于展平表的生成,我们是数据组写好一个存过,每天晚上跑批,因此,数据时效是T+1,即一天之后才会生成。因此该博客只是提供一个思路,具体还是看大家的项目到底想要如何实现。

猜你喜欢

转载自blog.csdn.net/death05/article/details/78915772