`

sql server 树形结构的创建

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


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
分享到:
评论

相关推荐

    sqlserver实现树形结构递归查询(无限极分类)的方法

    下面小编就为大家带来一篇sqlserver实现树形结构递归查询(无限极分类)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    sqlserver 树形结构查询单表实例代码

    --树形sql查询 WITH TREE AS( --创建一个虚拟表 SELECT * FROM sys_organiz --指定需要查询的表 WHERE organize_code = '100000' -- 指定父节点条件 UNION ALL --联合查询 SELECT sys_organiz.* FROM sys_...

    SQL Server 2008 商业智能完美解决方案(3)

    利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...

    SQL Server 2008商业智能完美解决方案 1/3

    利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...

    SQL Server 2008商业智能完美解决方案 3/3

    利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...

    SQL Server 2008商业智能完美解决方案 2/3

    利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...

    SQL Server 通过with as方法查询树型结构

    with as 公用表表达式类似VIEW,但是不并没有创建对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句

    PL/SQL Developer8.04官网程序_keygen_汉化

     可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象...

    PLSQLDeveloper下载

    对象浏览器——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、...

    Visual C#.NET 2008程序设计案例集锦 (源码)

    案例1.12 以树形显示的窗体 案例1.13 图案动画窗体 本章小结 第2章 图形图像处理技术 案例2.1 波形图特效 案例2.2 在图像中写入文字 案例2.3 图像缩放与翻转 .案例2.4 图像的涂沫 案例2.5 百叶窗图像效果 ...

    C#程序开发范例宝典(第2版).part13

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    C#程序开发范例宝典(第2版).part08

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    C#程序开发范例宝典(第2版).part02

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    C#程序开发范例宝典(第2版).part12

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

Global site tag (gtag.js) - Google Analytics