有表: 
 CREATE TABLE TBL_TEST
(
  ID    NUMBER,
  NAME  VARCHAR2(100 BYTE),
  PID   NUMBER                                  DEFAULT 0
); 
插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2'); 查询:
select * from TBL_TEST
 start with id=1
 connect by prior id = pid
为什么结果是:
       ID NAME                                                                                    PID
---------- -------------------------------------------------------------------------------- ----------
         1 10                                                                                        0
         2 11                                                                                        1
         5 121                                                                                       2
         4 12                                                                                        1
我不明白,请各位高手给详细的解释一下
小弟感激涕零!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

     start with id=1从ID=1的记录开始递归产生结构查询记录集
      

  2.   

    start with id=1
    所以Id = 1的记录被选出。(第一层)
    connect by prior id = pid
    ID = 2,4的这两条记录,他们的PID = 1,即上一层记录的ID,所以这两条被选出;(第二层)
    ID=5的这条记录,PID= 2,所以也被选出。(第三层)
      

  3.   

    start with id=1 --从ID是1的记录开始进行连接
    connect by prior id = pid --连接条件为其他记录中的ID的值为当前的PID, 下条记录又作为当前记录,以此类推
      

  4.   


    在start with子句之前加上 where level=1 --1或2,3,4
    可查询每一层的数据
      

  5.   

    shiyiwan那按照你的推理
    结果应该是:
    id
    1
    2
    4
    5
    为什么查询出来时:
    id
    1
    2
    5
    4
      

  6.   

    java3344520
    能解释一下你第二句话是什么意思吗?
      

  7.   

    深度遍历如果你的条件改为pid=0,就是全部都可以选出来了