|
8)、查询一个节点的父节点的的兄弟节点(伯父与叔父)。
- with tmp as(
- select tb_menu.*, level lev
- from tb_menu
- start with parent is null
- connect by parent = prior id)
-
- select b.*
- from tmp b,(select *
- from tmp
- where id = 21 and lev = 2) a
- where b.lev = 1
-
- union all
-
- select *
- from tmp
- where parent = (select distinct x.id
- from tmp x, --祖父
- tmp y, --父亲
- (select *
- from tmp
- where id = 21 and lev > 2) z --儿子
- where y.id = z.parent and x.id = y.parent);
复制代码
这里查询分成以下几步。
首先,将第7个一样,将全表都使用临时表加上级别;
其次,根据级别来判断有几种类型,以上文中举的例子来说,有三种情况:
(1)当前节点为顶级节点,即查询出来的lev值为1,那么它没有上级节点,不予考虑。
(2)当前节点为2级节点,查询出来的lev值为2,那么就只要保证lev级别为1的就是其上级节点的兄弟节点。
(3)其它情况就是3以及以上级别,那么就要选查询出来其上级的上级节点(祖父),再来判断祖父的下级节点都是属于该节点的上级节点的兄弟节点。
最后,就是使用union将查询出来的结果进行结合起来,形成结果集。 |
|