日期:2014-05-17  浏览次数:20938 次

填充树形数据时哪种方法更好啊?
见到过如下方法:
用select   *   取出所有数据   (数据库,表为自联接的表,每行数据有id   和parentid)
再用DataView过滤出符合的记录,用递归的方法填到TreeView等控件中

不过我觉得这种方法在数据量很大时是不是效率很差?

自己在思索更一种做法,先用递归的方法取出一个节点下所有 "正确 "的记录   ,再做一个递归填充到控件,当然,这样可能效率更差,只是,既然做了,就想知道个究竟   ,更想明白,通用的、较好的方法到底是怎么样的,求教高手(我是初学   ,想知道的更详细些,谢谢)

------解决方案--------------------
<style>
body,td,th
{
font-size:12px;
vertical-align:top;
}
th
{
layout-flow:vertical-ideographic ;
}
</style>

<TABLE border=1>
<TR>
<TD colspan=3 align=center> 两种树型结构SQL的对比.htm </TD>

</TR>
<TR>
<TH> 名称 </TH>
<TD> 方法1:父子结构Tree1表 </TD>
<TD> 方法2:编码结构Tree2表 </TD>
</TR>
<TR>
<TH> 数据形式 </TH>
<TD>
<xmp>
id pId content
--------------------------------------
1 0 节点
2 0 节点
...
11 1 节点
...
21 2 节点
...
121 12 节点
...
1110 110 节点
</xmp>
</TD>
<TD>
<xmp>
id nodeCode content
--------------------------------------
1 001 节点
2 002 节点
...
11 001001 节点
...
112 001001002 节点
...
1104 010010004 节点
...
</xmp>
</TD>
</TR>

<TR>
<TH> 建表语句 </TH>
<TD>
<xmp>
CREATE TABLE [dbo].[Tree1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[pId] [int] NULL ,
[content] [varchar] (10) NULL
) ON [PRIMARY]
</xmp>
</TD>
<TD>
<xmp>
CREATE TABLE [dbo].[Tree2] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[nodeCode] [varchar] (120) NOT NULL ,
[content] [varchar] (10) NULL
) ON [PRIMARY]
</xmp>
</TD>
</TR>


<TR>
<TH> 插入数据10+100+1000条,深度3,广度10 </TH>
<TD>
<xmp> --truncate table Tree1
declare @E int--广度循环变量
declare @EE int--广度循环变量
declare @EEE int--广度循环变量
declare @pId int--父id
declare @content varchar(10)

set @content= '节点 '
--添加第1层10个节点
set @E=1
while @E <=10
begin
set @pId=0
insert tree1(pId,content) values(@pId,@content)
set @E=@E+1
end
--添加第2层100个节点
set @E=1
while @E <=10
begin
set @EE=1
while @EE <=10
begin
set @pId=@E
insert tree1(pId,content) values(@pId,@content)
set @EE=@EE+1
end
set @E=@E+1
end
--添加第3层1000个节点
set @E=1
while @E <=10
begin
set @EE=1
while @EE <=10
begin
set @EEE=1
while @EEE <=10
begin
set @pId=@E*10 + @EE
insert tree1(pId,content) values(@pId,@content)
set @EEE=@EEE+1
end
set @EE=@EE+1
end
set @E=@E+1
end
--select count(*) from tree1 </xmp>

</TD>
<TD>
<xmp> --truncate table Tree2
declare @nodeCode varchar(30)
declare @content varchar(10)
declare @E int--广度循环变量
declare @EE int--广度循环变量
declare @EEE int--广度循环变量
set @content= '节点 '

--添加第1层10个节点
set @E=1
while @E <= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)