上图数据是需要的实际数据
下图是目标数据
这是具体实现的sql
select * from MBRC_REPORTTEMPLATE t start with t.id=517828 connect by prior t.pid=t.id
union
select * from MBRC_REPORTTEMPLATE t start with t.id=517828 connect by prior t.id=t.pid;
1.首先start with connect by prior就是向下遍历向上遍历拿取父子级关系数据sql.
2.其次start with connect by prior 只能选择往上或者往下,意思就是要么往下找子级,要么往上找父级
3.然后start with 是开始的条件,意思就是你从这个点开始往上往下,可以不加,不加就代表着全部按往上或者往下的顺序给你查出来
4.最后也是最重要的,prior后面是代表着根据什么条件进行往上往下.
你不能说从这个点给劳资滚,但是你不告诉它怎么滚,滚到哪…
当前数据 pid =下一条数据的 id
select * from MBRC_REPORTTEMPLATE t start with t.id=517828 connect by prior t.pid=t.id
1.上面的代码就是,当前代码是:从id=517828这条数据开始遍历,这条数据的pid是下一条数据的id,意思是啥,这个数据的父级是下一条数据
即:劳资去找劳资,往上遍历
当前数据的id = 下一条数据的pid
select * from MBRC_REPORTTEMPLATE t start with t.id=517828 connect by prior t.id=t.pid;
2.上面的代码就是,当前代码是:从id=517828这条数据开始遍历,这条数据的id是下一条数据的pid,意思是啥,这个数据是下一条数据父级
即:劳资才是劳资,劳资去找儿子,往下遍历
3.union 是求并集
就是把所有数据合并去掉重复值,这个应该很好理解
4.还有一个union all 是直接求并集,但是不去重,网上说它的效率高,尽可能的情况下使用union all
嗨,问这个怎么去重啊,都重复了,java的Set去重得了呗
不过个人看来,正常的2,3条用用也不影响,再怎么排序我就几条数据这个效率能影响到哪去.