你写的结果不正确,如果SQL这样写,那么得到的是:
A B
B S
S W
B D
如果这样,你发现两个(2,3两条记录)都满足CONNECT条件,你的过滤原则是什么?

解决方案 »

  1.   

    哦,我忘记了,我select最后加了一句order by:order by column1
      

  2.   

    select * from t1 where column1 in(select column2 from t1)
      

  3.   

    ???就算ORDER BY 那也是:
    A B
    B S
    B D
    S W
    你到底什么意思?
      

  4.   

    最简单的办法:把这个纪录删除,哈哈不知道你是否理解CONNECT BY的操作原理,现在你的问题中, B  D这样是否满足你的查询条件?如果满足那这个纪录必定会出现在结果中; 然后你要求按照COLUMN1排序,那么B  D必然出现在S  W之前.我实在看不出系统有什么不对的地方啊你到底想要什么?
      

  5.   

    呵呵,你就是弱水大哥啊,果然出手不凡。
    说的话甚是有理。
    keeper你的过滤原则是不是:
    去掉树状结构中,不到3层的分支。
    或者说是想得到,末梢节点层次为3的所有分支。
      

  6.   

    满足我现在的查询条件,但是不满足程序的要求。
    这个情况是我们的QA在做黑盒测试的某种临界情况下出现的,原来coding的时候没有考虑到数据库里会出现这样的数据,但是实际情况下出现了,而且也是不可能删除掉的。另外,我是理解connect by的操作原理的。
      

  7.   

    这种数据有多少?如果不多,或者有一定规律,那即使不能删,也可以考虑按一定规律删除,但查询完毕后ROLLBACK。
    如果没有规律,数据量又大,至少需要提供我一个过滤规则,我才能看看还有没有戏。
      

  8.   

    CONNECT BY查询中有一个伪列叫LEVEL,表示一行纪录在树型结构中的层次,请看下例:
    SQL> select * from t_tree
      2  start with id='A'
      3  connect by id= prior p_id;
    ID         P_ID
    ---------- ----------
    A          B
    B          S
    S          W
    B          DSQL> select x.*, level from t_tree x
      2  start with id='A'
      3  connect by id=prior p_id;
    ID         P_ID            LEVEL
    ---------- ---------- ----------
    A          B                   1
    B          S                   2
    S          W                   3
    B          D                   2SQL> select x.*, level from t_tree x
      2  where level < 3
      3  start with id='A'
      4  connect by id= prior p_id;
    ID         P_ID            LEVEL
    ---------- ---------- ----------
    A          B                   1
    B          S                   2
    B          D                   2如果你看明白了,那问题应该就解决了.TO chooser: 我在ORACLE版差不多一年了,可能比较多人知道我的名字. 其实我并不喜欢指名道姓地问问题, 而且也提出过多次不要这样做. 但是有些兄弟可能比较急,我也没有什么好办法... 另外,我的名字是弱水,不是溺水