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,即一天之后才会生成。因此该博客只是提供一个思路,具体还是看大家的项目到底想要如何实现。