爱飞 发表于 2015-1-16 22:28:22

MSSQL网页编程之一道 SQL 题 ... (关于树型布局的在干系...

这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。树型布局
相干会商毗连:
http://expert.csdn.net/Expert/TopicView1.asp?id=1477009
原题:
表:
Tree(ID,ParentID,Remark)

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=@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(,0),@ParentID=isnull(,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(,0),@ParentID=isnull(,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

/*
别的还要说一下封装的水平的成绩,详细情形详细剖析,
本题就不合适界说函数间接失掉终极了局!
以上谜底仅供参考!!
接待持续介入会商!
*/
因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。

变相怪杰 发表于 2015-1-19 13:51:56

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

乐观 发表于 2015-1-19 13:51:57

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

精灵巫婆 发表于 2015-1-25 07:27:33

你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。

愤怒的大鸟 发表于 2015-2-2 17:43:32

数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。

admin 发表于 2015-2-8 03:15:48

如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。

飘飘悠悠 发表于 2015-2-24 03:45:32

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

冷月葬花魂 发表于 2015-3-15 01:36:34

相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐

兰色精灵 发表于 2015-3-21 16:54:00

这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
页: [1]
查看完整版本: MSSQL网页编程之一道 SQL 题 ... (关于树型布局的在干系...