sql server 树形结构的创建

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


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

猜你喜欢

转载自joeze.iteye.com/blog/1932222