表结构如下:
id  |  pid
1   |   0  
2   |   1
3   |   1 
4   |   3
5   |   4
..      ..
已知某个id号 ,如何删除这个Id号下所有的子孙记录。
如已知id为1 则删除第1,2,3,4,5条记录.因为 记录2 的pid=1,记录3的Pid=1,记录4的PID=3....

解决方案 »

  1.   

    如果是删除大于id为1的SQL为
    delete 表名 where id>=1
    如果是删除pid=1的则为
    delete 表名 where id=1 or pid=1
    到于怎么用SQL语句
    ADO和DAO中都有一个Execute方法

    sql="delete 表名 where id=1 or pid=1"
    database.execute sql
      

  2.   

    刚才没看清题义
    用递归吧
    如下面的
    Function DeleteID(mID As Integer) As Integer
        Dim rs As Recordset
        mDB.Execute "delete from test where id=" & mID
        Set rs = mDB.OpenRecordset("select * from test where pid=" & mID)
        Do While Not rs.EOF
            DeleteID rs.Fields("ID")
            rs.MoveNext
        Loop
    End Function
      

  3.   

    hnsyf() 说得对。用递归或嵌套的方法可以解决!Public Sub Gadd_Child(ID As String)     'ID是已经知道的ID号
        Dim Cn As New ADODB.Connection
        Dim Rs As New ADODB.Recordset
        Dim i As Integer
        
        Cn.Open 连接字符串
        Rs.Open "select * from 表名 where pid='" & ID & "'", Cn, adOpenStatic, adLockBatchOptimistic
        If Rs.RecordCount > 0 Then Rs.MoveFirst
        For i = 1 To Rs.RecordCount
            ID = Rs("pid")
            Call Gadd_Child(ID)
            Rs.MoveNext
        Next i
        Rs.Open "delete from 表名 where pid='" & ID & "'", Cn, adOpenStatic, adLockBatchOptimistic
    End Sub
      

  4.   

    这样好像不行,当运行一次递归后,Rs已经变了,Rs.movenext也变了?
      

  5.   

    先用遞歸得到當前ID的所有子記錄的PID放入一臨時表(#table)中,delete table 
    where pid in (select pid from #table)
      

  6.   

    我使用是没有问题的!每次递归Rs都是新建立的!
    Dim Rs As New ADODB.Recordset