sql server 树形结构的创建

需要用到树形结构,在看了[url]http://www.cnblogs.com/zplutor/archive/2009/07/31/1536146.html[/url],原作只说了大概思路,让人费解,下面用比较清晰的过程描述下:
表结构:
lib_items:
[table]
|version_id|item_id|parent_id|desc
[/table]


1
1.1
1.1.1
1.1.2
1.2
2
3
4

思路:
1.先将1,2,3,4设为第0级,放到临时表#TreeViewTemp
此时结构#TreeViewTemp为:

[0] 1
[0] 2
[0] 3
[0] 4

2.再将1的子查出,设置子的level为+1,将1.1,1.2放到临时表#TreeViewTemp,将1放到结果表#TreeViewResult,删掉1,设置level=level+1
此时结构#TreeViewTemp为:

[0] 2
[0] 3
[0] 4
[1] 1.1
[1] 1.2

此时结构#TreeViewResult为:

1

3.查询level为1的第一个item,查到1.1,查询1.1的子为1.1.1,1.1.2,设置level为2放到临时表#TreeViewTemp,将1.1放到结果表#TreeViewResult,在临时表中删掉1.1,设置level=level+1
此时结构#TreeViewTemp为:

[0] 2
[0] 3
[0] 4
[1] 1.2
[2] 1.1.1
[2] 1.1.2

此时结构#TreeViewResult为:

1
1.1

4.查询level为2的第一个item,查到1.1.1,查询1.1.1的子为空,将1.1.1放到结果表#TreeViewResult,在临时表中删掉1.1.1,设置level=level+1
此时结构#TreeViewTemp为:

[0] 2
[0] 3
[0] 4
[1] 1.2
[2] 1.1.2

此时结构#TreeViewResult为:

1
1.1
1.1.1

5.查询level为3的,为空,level-1,进入下一次,树结构没变
6.查询level为2的第一个item,查询到1.1.2,查询1.1.2的子为空,将1.1.2放到结果表#TreeViewResult,在临时表中删掉1.1.2,设置level=level+1
此时结构#TreeViewTemp为:

[0] 2
[0] 3
[0] 4
[1] 1.2

此时结构#TreeViewResult为:

1
1.1
1.1.1
1.1.2

7,count一直减到1,操作1.2的,以此类推,最终结果会是:
此时结构#TreeViewResult为:

1
1.1
1.1.1
1.1.2
1.2
2
3
4

完整代码如下:

ALTER PROCEDURE [dbo].[sp_items_level_test]
@versionId varchar(30)
AS
BEGIN
DECLARE @item_id varchar(20), @Level int;
SET @Level = 0

CREATE TABLE #TreeViewTemp
(
item_id varchar(20) NOT NULL,
desc nvarchar(500) NOT NULL,
parent_id varchar(20) NULL,
[Level] int NOT NULL
)
CREATE TABLE #TreeViewResult
(
item_id varchar(20) NOT NULL,
desc nvarchar(500) NOT NULL
)

INSERT #TreeViewTemp
SELECT item_id, desc, parent_id, @Level
FROM lib_items
WHERE parent_id = '' and version_id = @versionId

WHILE EXISTS (SELECT item_id FROM #TreeViewTemp)
BEGIN

SELECT TOP(1) @item_id = item_id
FROM #TreeViewTemp
WHERE [Level] = @Level
ORDER BY item_id

IF @@ROWCOUNT = 0
BEGIN
SET @Level = @Level - 1
CONTINUE
END

INSERT #TreeViewResult
SELECT item_id, SPACE(4 * @Level) + desc0
FROM #TreeViewTemp
WHERE item_id = @item_id

INSERT #TreeViewTemp
SELECT item_id, desc, parent_id, @Level + 1
FROM lib_items
WHERE parent_id = @item_id and version_id = @versionId

IF @@ROWCOUNT <> 0
SET @Level = @Level + 1

DELETE #TreeViewTemp
WHERE item_id = @item_id

END

SELECT item_id, desc0 FROM #TreeViewResult

DROP TABLE #TreeViewTemp
DROP TABLE #TreeViewResult
END
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值