多个条件递归sql

xingmyworld 2015-01-07 12:15:51
A表结构:
child parent status start_date end_date
子件 父件 状态 开始时间 结束时间

想向上递归,查询父件状态为"Y"的,当前时间在开始和结束时间之间的数据,如果父件不满足这些条件不往上递归

select * from A
start with child='child1'
connect by prior parent=child and prior status='Y'
and prior start_date<=sysdate and prior end_date>=sysdate


请教大家,这样写法有问题吗?
...全文
558 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-01-08
  • 打赏
  • 举报
回复
如果是保持父子层次的“向上递归”,也应该是 connect by parent= prior child 啊!
所以楼主说的“往上递归”到底是解释逻辑还是限定语法要求?没有解释清楚啊。
bw555 2015-01-08
  • 打赏
  • 举报
回复
引用 6 楼 Tiger_Zhao 的回复:
select * from A
start with child='child1'
connect by prior child=parent -- 你方向搞反了把,向上递归其实子件才是“上级”
and (  (prior child='child1') -- 先保证开始的子件连上父件
     OR(-- 然后再对已经连进来的父件进行判断,决定是否连父件的父件
            prior status='Y' 
        and prior start_date<=sysdate
        and prior end_date>=sysdate
       )
     )
开始我也是直接看语句,以为写反了,后来看下面描述是是要向上递归的,这条件写得没错
xingmyworld 2015-01-07
  • 打赏
  • 举报
回复
自己顶一下d
Tiger_Zhao 2015-01-07
  • 打赏
  • 举报
回复
select * from A
start with child='child1'
connect by prior child=parent -- 你方向搞反了把,向上递归其实子件才是“上级”
and ( (prior child='child1') -- 先保证开始的子件连上父件
OR(-- 然后再对已经连进来的父件进行判断,决定是否连父件的父件
prior status='Y'
and prior start_date<=sysdate
and prior end_date>=sysdate
)
)

xingmyworld 2015-01-07
  • 打赏
  • 举报
回复
引用 4 楼 z_shousi 的回复:
[quote=引用 3 楼 xingmyworld 的回复:] [quote=引用 2 楼 bw555 的回复:]
connect by prior parent=child and status='Y' 
and start_date<=sysdate and end_date>=sysdate
你这写法不对的,我验证过了 你这样写父件还会继续往上递归, status='Y' and start_date<=sysdate and end_date>=sysdate这个与写在where条件是一样的效果 [/quote] 楼主,两种写法是不一样的啊。 where筛选的话是对最后的结果的过滤,不影响connect by出来的层次关系。 而楼上那种
connect by prior parent=child and status='Y' 
and start_date<=sysdate and end_date>=sysdate
[/quote] 放在连接条件里面会影响递归的,楼主应该要的就是这种结果啊。[/quote] 打个比方,我想要父件status为"Y"的继续递归,但不为Y的话,最后一层会把所有的状态都查出来,比如最后一层status为"N"的也是我 需要的. 如果按你们的那样写法,最后一层status为"N"的也会被过虑掉的
  • 打赏
  • 举报
回复
引用 3 楼 xingmyworld 的回复:
[quote=引用 2 楼 bw555 的回复:]
connect by prior parent=child and status='Y' 
and start_date<=sysdate and end_date>=sysdate
你这写法不对的,我验证过了 你这样写父件还会继续往上递归, status='Y' and start_date<=sysdate and end_date>=sysdate这个与写在where条件是一样的效果 [/quote] 楼主,两种写法是不一样的啊。 where筛选的话是对最后的结果的过滤,不影响connect by出来的层次关系。 而楼上那种
connect by prior parent=child and status='Y' 
and start_date<=sysdate and end_date>=sysdate
[/quote] 放在连接条件里面会影响递归的,楼主应该要的就是这种结果啊。
xingmyworld 2015-01-07
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
connect by prior parent=child and status='Y' 
and start_date<=sysdate and end_date>=sysdate
你这写法不对的,我验证过了 你这样写父件还会继续往上递归, status='Y' and start_date<=sysdate and end_date>=sysdate这个与写在where条件是一样的效果
bw555 2015-01-07
  • 打赏
  • 举报
回复
connect by prior parent=child and status='Y' 
and start_date<=sysdate and end_date>=sysdate

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧