建立了一张问题类型表,PROBLEMSTYPE
(
  PROBLEMTYPEID   类型ID,
  PROBLEMTYPENAME 类型名称,
  PROBLEMLEVEL    问题类型所在层次,
  PARENTTYPEID    父类型ID,
  TYPEPATH        路径,
  DESCRIPTION     描述
)问题类型是一层次结构,一个问题类型可以通过其PARENTTYPEID找到其上级问题类型,PROBLEMLEVEL记录该问题类型所在的层次,如何写查询语句,可以得到每个问题类型的根ID(即它的最高上级)

解决方案 »

  1.   

    SELECT a.*
    FROM PROBLEMSTYPE a
    START WITH a.PROBLEMTYPEID=?
    CONNECT BY PRIOR a.PARENTTYPEID=a.PROBLEMTYPEID取最后一行记录
      

  2.   

    drop table PROBLEMSTYPE;
    create table PROBLEMSTYPE(  
      PROBLEMTYPEID varchar2(20), 
      PROBLEMTYPENAME varchar2(20), 
      PROBLEMLEVEL varchar2(20), 
      PARENTTYPEID varchar2(20), 
      TYPEPATH  varchar2(200), 
      DESCRIPTION varchar2(200) 
    );
    insert into PROBLEMSTYPE select '0','类型名称0','问题类型所在层次0',null,'路径0','描述0' from dual;
    insert into PROBLEMSTYPE select '1','类型名称1','问题类型所在层次1','0','路径1','描述1' from dual;
    insert into PROBLEMSTYPE select '2','类型名称2','问题类型所在层次2','1','路径2','描述2' from dual;
    insert into PROBLEMSTYPE select '3','类型名称3','问题类型所在层次3','1','路径3','描述3' from dual;
    insert into PROBLEMSTYPE select '4','类型名称4','问题类型所在层次4','2','路径4','描述4' from dual;
    insert into PROBLEMSTYPE select '5','类型名称5','问题类型所在层次5','3','路径5','描述5' from dual;
    insert into PROBLEMSTYPE select '6','类型名称6','问题类型所在层次6','1','路径6','描述6' from dual;select level as 层级,
           decode(level, 1,'*', 2,'**', 3,'***', 4,'****') 层次星星数,
           CONNECT_BY_ROOT(PROBLEMTYPEID) 最顶层,
            PROBLEMSTYPE.*
    from PROBLEMSTYPE 
    start with PARENTTYPEID is null 
    connect by prior PROBLEMTYPEID=PARENTTYPEID ;--结果如下:
          层级 层次星星数 最顶层               PROBLEMTYPEID        PROBLEMTYPENAME      PROBLEMLEVEL         PARENTTYPEID         TYPEPATH                                                                         DESCRIPTION
    ---------- ---------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
             1 *          0                    0                    类型名称0            问题类型所在层次0                         路径0                                                                            描述0
             2 **         0                    1                    类型名称1            问题类型所在层次1    0                    路径1                                                                            描述1
             3 ***        0                    2                    类型名称2            问题类型所在层次2    1                    路径2                                                                            描述2
             4 ****       0                    4                    类型名称4            问题类型所在层次4    2                    路径4                                                                            描述4
             3 ***        0                    3                    类型名称3            问题类型所在层次3    1                    路径3                                                                            描述3
             4 ****       0                    5                    类型名称5            问题类型所在层次5    3                    路径5                                                                            描述5
             3 ***        0                    6                    类型名称6            问题类型所在层次6    1                    路径6                                                                            描述67 rows selected
      

  3.   

    CONNECT_BY_ROOT(PROBLEMTYPEID)是另写的一个存储过程么?
      

  4.   

    不是存储过程是oracle 10g才有的
      

  5.   

    我用的是orcale 9i,可 有别的方式替代啊?
      

  6.   

    9i的话,你可以试试sys_connect_by_path,不过这个可能就麻烦点了,你可以了解一下这方面的知识
      

  7.   

    看看这个可以不?
    select  SUBSTR(SYS_CONNECT_BY_PATH(PROBLEMTYPEID,','),2,INSTR(SYS_CONNECT_BY_PATH(PROBLEMTYPEID,','),',',1,2) 顶节点
            PROBLEMSTYPE.*
    from PROBLEMSTYPE 
    start with PARENTTYPEID is null 
    connect by prior PROBLEMTYPEID=PARENTTYPEID ;