我有一个Demo表
id  name parentid
1     A      -1
2     B       A
3     C       B
4     D       C
5     E       D
有没有一条SQL可以直接删除这个累死树形结构的表的啊?   

解决方案 »

  1.   

    DELETE  from demo t where t.id in (select id from demo start with parentid='-1' connect by prior name=parentid);
      

  2.   

    delete from demo 
    where id in(select id from demo start with parentid=-1 connect by name=prior parentid)
      

  3.   

    兄台这条语句不行,我数据库里的情况可能比这个还要复杂点。这条删除语句我在前面已经尝试过了!~~可能是删除顺序的原因,比如说A下面有B孩子,它可能先要删除A,但是根据完整性约束是无法删除的。
      

  4.   

    先用select语句得出最大的level,然后对level做for i in 1..maxlevel loop
    DELETE  from demo t where t.id in (select id from demo where connect_by_isleaf=1 start with parentid=入参 connect by prior name=parentid);
    end loop;
     
     
      

  5.   

    我是刚毕业的菜菜,接触不到那个。不过我执行那语句的时候报
    ORA-02292: 违反完整约束条件 (ETRAINING.SYS_C008310) - 已找到子记录!
    这是SQL:
    delete from t_chapter c where c.chpt_id in (select chpt_id from t_chapter start with  parent = 195301 Connect by prior chpt_id = parent) ;
      

  6.   

    我可能比较笨哦,理解的很慢。
    select找出最大LEVEL,如果最大级是个集合,有N个同级的怎么处理啊?
      

  7.   

    大概意思就是这样
    SQL> CREATE OR REPLACE PROCEDURE proc_del_demo(i_root VARCHAR2) AS
      2    v_lvl NUMBER;
      3  BEGIN
      4    SELECT MAX(LEVEL)
      5      INTO v_lvl
      6      FROM demo
      7     START WITH parentid = i_root
      8    CONNECT BY PRIOR NAME = parentid;
      9    FOR i IN 1 .. v_lvl LOOP
     10      DELETE FROM demo t
     11       WHERE t.id IN (SELECT id
     12                        FROM demo
     13                       WHERE connect_by_isleaf = 1
     14                       START WITH parentid = i_root
     15                      CONNECT BY PRIOR NAME = parentid);
     16    END LOOP;
     17  END;
     18  /
     
    Procedure created
     
    SQL> select * from demo;
     
            ID NAME                                                                             PARENTID
    ---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
             1 A                                                                                -1
             2 B                                                                                A
             3 C                                                                                B
             4 D                                                                                C
             5 E                                                                                D
     
    SQL> exec proc_del_demo('-1');
     
    PL/SQL procedure successfully completed
     
    SQL> select * from demo;
     
            ID NAME                                                                             PARENTID
    ---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
     
    SQL> 
      

  8.   

    是我太愚钝了唉!~~存储过程没学好,看了一知半解的。
    辛苦拉!~~~呵呵。公司用的hibernate,不知道hibernate支持不支持存储呢!~~~
    实在不行 用递归去了····玩命了!
      

  9.   

    哈哈,hibernate是支持存储过程的,不过据说支持的不好.