由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 是过滤条件,用于对返回的所有记录进行过滤。(可以忽略)

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

IDORG_IDORG_NAMEPAR_ORG_ID….
1001父机构1….
2002父机构2….
3001001子机构11001….
4001002子机构21001….
5002001子机构21002….
6002002001子机构221002001….

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

IDORG_IDPAR_ORG_ID
1001001
2001001001
3001002001
4001001001001
5001002001002
6002002
7002001002
8002002001002
8002001002001
9002002001002001
10002002001002002001

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值