查询树中排除存在于EMP2表中EMPNO的分支,前一种sql正确的,后两种使用not exists与not in 都报错误 
     SELECT EMPNO,RPAD(“,LEVE*3)||ENAME EMPLOYEE,MGR
     FROM EMP
     CONNECT BY PRIOR EMPNO=MGR
     AND ENAME!=‘SCOTT’
     START WITH ENAME =‘KING’
     SELECT EMPNO,RPAD(“,LEVE*3)||ENAME EMPLOYEE,MGR
     FROM EMP
     CONNECT BY PRIOR EMPNO=MGR
     AND NOT EXISTS (SELECT 'A' FROM EMP2 T WHERE T.EMPNO = EMPNO) 
     START WITH ENAME =‘KING’
     SELECT EMPNO,RPAD(“,LEVE*3)||ENAME EMPLOYEE,MGR
     FROM EMP
     CONNECT BY PRIOR EMPNO=MGR
     AND EMPNO NOT IN (SELECT EMPNO FROM EMP2 T) 
     START WITH ENAME =‘KING’

解决方案 »

  1.   

    都是中文字符,那个汗。你确认是ORACLE?LEVE是什么东东?LEVEL?
      

  2.   

    1 楼不知道level啊? 哎呀,我知道啊,原来我俨然专家了,哈哈~ bs自己一下
      

  3.   

    哦 看错了 。1楼的是说leve 不知道。汗~~~~~
      

  4.   

    呵呵,经常用到树型查询,想不知道都难。我只是觉得很奇怪,1是怎么执行成功的。还以为是MYSQL什么的
      

  5.   

    是LEVEL,SQL是别的网站上复制过来的     SELECT EMPNO,MGR
         FROM EMP
         CONNECT BY PRIOR EMPNO=MGR
         AND ENAME!='SCOTT'
         START WITH ENAME ='KING'      SELECT EMPNO,MGR
         FROM EMP
         CONNECT BY PRIOR EMPNO=MGR
         AND EMPNO NOT IN (SELECT EMPNO FROM EMP2 T) 
         START WITH ENAME ='KING'
      

  6.   

    就是啊。排除这个level不算。也会提示 :connect by 子句中不能具有子查询 错误。
      

  7.   

    就是有这个错误,不能解决啊,有没有其他的办法,因为是我Oracle 9i,10g是能解决的,但更换Oracle可行性不大
      

  8.   

    不大清楚你的需求是什么,emp2是什么样的
    这个是你要的吗?
       SELECT EMPNO,MGR
         FROM EMP where EMPNO NOT IN (SELECT EMPNO FROM EMP2 T) 
         CONNECT BY PRIOR EMPNO=MGR  
         START WITH ENAME ='KING'
      

  9.   

    谢谢vber1010回答
    这个sql没有问题,只是只去掉树中的单个节点(EMP2中的EMPNO),我想去掉整个分支,而不是单个节点
      

  10.   

    emp2内放要屏蔽的EMPNO,把EMPNO的分支从树中排除。
      

  11.   

    在9i下用这个
    --not in
    SELECT *
      FROM (SELECT LEVEL, t.empno, t.ename, t.mgr
              FROM emp t
             START WITH ename = 'KING'
            CONNECT BY PRIOR t.empno = t.mgr) b
     WHERE b.empno NOT IN (SELECT empno
                             FROM emp t
                            START WITH empno IN (SELECT empno FROM emp2)
                           CONNECT BY PRIOR t.empno = t.mgr)
    --not exists
    SELECT *
      FROM (SELECT LEVEL, t.empno, t.ename, t.mgr
              FROM emp t
             START WITH ename = 'KING'
            CONNECT BY PRIOR t.empno = t.mgr) b
     WHERE NOT EXISTS (SELECT 1
              FROM (SELECT t.empno, t.ename, t.mgr
                      FROM emp t
                     START WITH empno IN (SELECT empno FROM emp2)
                    CONNECT BY PRIOR t.empno = t.mgr) c
             WHERE b.empno = c.empno);
      

  12.   

    10g写法简单一些,9i中connect by子句中不允许子查询
    --not in
    SELECT LEVEL, t.empno, t.ename, t.mgr
      FROM emp t
     START WITH ename = 'KING'
    CONNECT BY PRIOR t.empno = t.mgr AND
               t.empno NOT IN (SELECT a.empno FROM emp2 a);--not exists
    SELECT LEVEL, t.empno, t.ename, t.mgr
      FROM emp t
     START WITH ename = 'KING'
    CONNECT BY PRIOR t.empno = t.mgr AND
               NOT EXISTS (SELECT 1 FROM emp2 a WHERE a.empno = t.empno);