|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。树型布局
相干会商毗连:
http://expert.csdn.net/Expert/TopicView1.asp?id=1477009
原题:
表:
Tree(ID[Integer],ParentID[Integer],Remark[varchar])
INSERTINTOTree(ID,ParentID)
SELECT1,0
UNIONALL
SELECT2,1
UNIONALL
SELECT3,1
UNIONALL
SELECT4,2
UNIONALL
SELECT5,4
UNIONALL
SELECT6,5
UNIONALL
SELECT7,2
T(F1,......)
INSERTINTOT(F1)
SELECT1
UNIONALL
SELECT5
UNIONALL
SELECT3
UNIONALL
SELECT4
UNIONALL
SELECT1
UNIONALL
SELECT7
UNIONALL
SELECT6
UNIONALL
SELECT4
UNIONALL
SELECT5
UNIONALL
SELECT3
UNIONALL
SELECT4
UNIONALL
SELECT1
UNIONALL
SELECT7
UNIONALL
SELECT6
UNIONALL
SELECT4
参考Tree表中的父子干系,"先人"的纪录数要包含一切"儿女"的纪录数,统计T表中F1各个取值的纪录数?
IDCounts
115
210
32
48
54
62
72
谜底及复杂剖析:
/*
看了前几团体的谜底,仿佛都把成绩想庞大了"游标"、"一时表"、"递回"。
"游标"、"一时表"完整能够不必!
"递回"头脑固然应是办理树型布局的该想到的办法!
可是T-SQL的嵌套条理最多只能到32!
icevi(按钮工场)的倡议长短常值得倡始的,只管ID,ParentID关于仅存储是充足经济的,
可是若用其供应体现情势,功能切实其实不会太好!
很多高效的树型布局论坛也的确是存储并保护各个节点的条理信息的数据,如许
显现起来仅需一条SQL便可!
上面是我的参考谜底,两个自界说函数功效几近一样,都是运算出后面所提的,
应最好自动保护的"条理信息":
办法一:UDF递回完成!有32层嵌套限定
*/
alterFUNCTIONdbo.Get32Ancestors
(@Xinteger)
RETURNSVARCHAR(250)
AS
BEGIN
DECLARE@IDinteger
DECLARE@ReturnValueVARCHAR(250)
SELECTTOP1@ID=ParentID
FROMtree
WHERE[id]=@X
IF@ID@X
BEGIN
SELECT@ReturnValue=cast(ISNULL(dbo.Get32Ancestors(@ID),)asvarchar)+-+cast(@Xasvarchar)
END
ELSESET@ReturnValue=@ID
RETURN@ReturnValue
END
go
/*
2003-3-5
办法二:无任何限定,若条理太深,效力固然不会高(仿佛也没更好的举措)
改善了一下:
1.一般节点均从0显现!0-1-3
2.断码显现-7-8-9-10
3.GetAllAncestors(不存在的节点)前往NULL
4.GetAllAncestors(根节点)前往0-本人
5.逝世轮回点显现:4-5-6-4-8
*/
alterfunctionGetAllAncestors(@Xinteger)
returnsvarchar(1000)
as
begin
declare@ReturnValuevarchar(1000)
declare@IDinteger
declare@ParentIDinteger
set@ID=-1
selecttop1@ID=isnull([ID],0),@ParentID=isnull([ParentID],0)
fromtree
whereID=@X
while@id@parentidand@parentid0and@ID>0
and-+isnull(@ReturnValue,)+-notlike%-+cast(@idasvarchar)+-%
begin
if@ReturnValueisnotnull
set@ReturnValue=-+@ReturnValue
set@ReturnValue=cast(@idasvarchar)+isnull(@ReturnValue,)
set@id=-1
selecttop1@ID=isnull([ID],0),@ParentID=isnull([ParentID],0)
fromtree
whereID=@parentid
end
set@ReturnValue=-+@ReturnValue
if@id>0
set@ReturnValue=cast(@idasvarchar)+isnull(@ReturnValue,)
if@parentid=0or@id=@parentid
set@ReturnValue=0-+isnull(@ReturnValue,)
return(@ReturnValue)
--selectdbo.GetAllAncestors(10)
end
go
/*
办法一是"妙手"的惯性头脑把复杂的成绩弄庞大了,"太累"!
办法二是思绪复杂明晰,不仅是"菜鸟"首选,"妙手"也应深思!
如果本题分为两问:
1.求各节点条理信息
2.求属各节点含儿女的纪录数
大概人人就会遭到一些启示!
函数界说完,上面就应当和icevi(按钮工场)同道的谜底殊途同归、不谋而和了
*/
selectid,dbo.GetAllAncestors(id)
,(selectcount(*)
fromT
where-+dbo.GetAllAncestors(f1)+-like%-+cast(tree.idasvarchar)+-%)
fromtree
selectid,dbo.Get32Ancestors(id)
,(selectcount(*)
fromT
where-+dbo.Get32Ancestors(f1)+-like%-+cast(tree.idasvarchar)+-%)
fromtree
/*
别的还要说一下封装的水平的成绩,详细情形详细剖析,
本题就不合适界说函数间接失掉终极了局!
以上谜底仅供参考!!
接待持续介入会商!
*/
因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。 |
|