到目前为止,已经解决了。alter procedure SP_Test @ClassID nchar(10) as declare @id int set @id=@ClassID; with RootNodeCTE(id,ParentID) as ( Select PKID,ParentPKID from T where ParentPKID in (@id) Union all Select T.PKID,T.ParentPKID From RootNodeCTE inner join T on RootNodeCTE.id=T.ParentPKID ) delete from T Where PKID In ( Select id from RootNodeCTE union all Select @classid )
传入parentId与id参数,根据传入的参数去select该节点的id(select id from T where parentId=id),发现该id无子节点的时候,就删除该节点(id)。
{
foreach(var child in GetChildren(x))
{
删除子节点(child);
x.Nodes.Remove(child);
}
}
{
foreach(node child in GetChildren(x))
{
删除子节点(child);
x.Nodes.Remove(child);
}
}仅仅写到这个程度就行了,这就是搞好了高层次的设计。然后,你需要花时间来论证一下,输入参数够了吗?为什么不需要更多的参数了?输出的是要求的结果吗?你这个时候不应该花精力去纠缠什么底层如何实现的问题,应该学会在这个层次先论证出结论,然后等有闲工夫时采取把这个方法中低层次的部分实现(但是这个方法的接口早已经定下来了,不会再改变了)。
{
foreach(node child in GetChildren(x))
{
if( !存在子节点(child))
x.Nodes.Remove(child);
}
}
这跟你要处理的东西是数据库表记录、内存里的对象、控件之类的,有关系吗?假设这里把node实际上只是一个简单的数据库表中的某个int类型的字段值,会影响这个程序的实现吗?你会因为什么“数据库表、内存对象、控件”的形式不同,而去推翻了这个程序吗?那么你需要有一种正规的程序设计课程,告诉你从哪一个出发点开始进行(伪)代码编写。
谢谢,我已经验证一下午了,就这个递归的,但总是出不来结果,我是根据一个id,然后sql里一个去查询出来的,代码里写不出。
@ClassID nchar(10)
as
declare @id int
set @id=@ClassID;
with RootNodeCTE(id,ParentID)
as
(
Select PKID,ParentPKID from T
where ParentPKID in (@id)
Union all
Select T.PKID,T.ParentPKID
From RootNodeCTE
inner join T on RootNodeCTE.id=T.ParentPKID
)
delete from T
Where PKID In
(
Select id from RootNodeCTE
union all
Select @classid
)
以上是解决方法,当前选中行,在代码里delete。谢谢两位的热心解答。