表结构:
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