我有一个表,是树状结构
parent  child  child_type
------------------------
p1         c1      normal
p1         c2      normal
c2         s1      special
c2         s2      special
s1         n1      normal结构如下
p1
  ┣ c1
  ┗ c2
      ┣ s1
      ┃  ┗ n1
      ┗s2我想要下面的查询结果
parent  child  special_str
-----------------------------
p1         c1
p1         c2       s1,s2说明:把子类型为SPECIAL的数据写到父级与父级的关系中,SPECIAL_STR是查询中拼出来的列
比如C2下有两个Special的数据s1和s2,c2的父级是p1,就把s1和s2拼起来写到c2和p1的关联中
需要注意的是special类型的数据的所有下层都不显示,即遇到SPECIAL类型的数据该树的这个分支就截止,如n1这个查询好难的,哪位专家有办法?

解决方案 »

  1.   

    在sys_connect_by_path之前,过滤掉n1这类的字节点就可以了。
      

  2.   

    SQL> select a.parent,a.child,b.special_str from(
      2  select parent,child from t6
      3  start with parent='p1'
      4  connect by prior child=parent and child_type<>'special') a,(
      5  select parent,wmsys.wm_concat(child) special_str from t6
      6  where child_type='special' group by parent) b
      7  where a.child=b.parent(+)
      8  order by parent,child;PARENT     CHILD      SPECIAL_STR
    ---------- ---------- ---------------
    p1         c1
    p1         c2         s1,s2
      

  3.   

    好强的语句啊!
    我试了一下,wmsys.wm_concat好像在ORACLE9.2下不好使
    有没有什么办法在ORACLE9下实现拼接字符串
      

  4.   

    我安装了ORACLE10,找到了wmsys.wm_concat函数,但显示不了源码
    我想把这个函数用在ORACLE9上,有办法吗?
      

  5.   

    不一定要用wmsys.wm_concat的,给个网址你参考一下:
    http://valen.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-153656-uid-51502.html
      

  6.   

    这个好像不行,我试过!
    10g里面的那个function不知道怎么的,看不懂!
    你还是查一下关于wmsys.wm_concat的资料吧。
      

  7.   

    谢谢了,实在没办法,我自己写了个FUNCTION