需要用到树形结构,在看了
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
分享到:
相关推荐
下面小编就为大家带来一篇sqlserver实现树形结构递归查询(无限极分类)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
--树形sql查询 WITH TREE AS( --创建一个虚拟表 SELECT * FROM sys_organiz --指定需要查询的表 WHERE organize_code = '100000' -- 指定父节点条件 UNION ALL --联合查询 SELECT sys_organiz.* FROM sys_...
利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...
利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...
利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...
利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...
with as 公用表表达式类似VIEW,但是不并没有创建对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句
可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象...
对象浏览器——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、...
案例1.12 以树形显示的窗体 案例1.13 图案动画窗体 本章小结 第2章 图形图像处理技术 案例2.1 波形图特效 案例2.2 在图像中写入文字 案例2.3 图像缩放与翻转 .案例2.4 图像的涂沫 案例2.5 百叶窗图像效果 ...
实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...
实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...
实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...
实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...