sql得到孩子节点列表
来源:互联网 发布:3ds淘宝哪家店好 编辑:程序博客网 时间:2024/04/28 00:56
我在用sql语句编写存储过程时,得到孩子节点的语句很不好做,逻辑性比较强,csdn社区上答贴时也没有花更多时间写,今天做项目时遇到了,所以写了一个,与大家分享。
想要得到的效果:
得到的table中的记录是类似于树形结构,孩子节点紧随父节点如:
处理之前的数据:
ID PID LEVEL
----------- ----------- -----------
1 0 0
6 5 3
7 6 4
2 1 1
3 1 1
4 2 2
5 3 2
8 10 1
9 8 2
10 0 0
11 10 1
处理之后的数据:
ID PID LEVEL
---------- ---------- -----------
1 0 0
2 1 1
4 2 2
3 1 1
5 3 2
6 5 3
7 6 4
10 0 0
8 10 1
9 8 2
11 10 1
sql语句:
create table BOM(ID INT,PID INT,[LEVEL] INT)
insert into BOM select 1,0,0
insert into BOM select 6,5,3
insert into BOM select 7,6,4
insert into BOM select 2,1,1
insert into BOM select 3,1,1
insert into BOM select 4,2,2
insert into BOM select 5,3,2
insert into BOM select 8,10,1
insert into BOM select 9,8,2
insert into BOM select 10,0,0
insert into BOM select 11,10,1
go
SELECT * FROM BOM
ID PID LEVEL
----------- ----------- -----------
1 0 0
6 5 3
7 6 4
2 1 1
3 1 1
4 2 2
5 3 2
8 10 1
9 8 2
10 0 0
11 10 1
(11 row(s) affected)
--创建用户定义函数用于取每个父节点下子节点
create function f_getChild(@PID int)
returns @t table(ID VARCHAR(10),PID VARCHAR(10),[LEVEL] INT)
as
begin
declare @i int
declare @tb table(ID VARCHAR(10),PID VARCHAR(10),[LEVEL] INT)
set @i = 0
insert into @tb select ID,PID,[LEVEL] from BOM where PID = @PID
declare @ID INT
while @i < (select count(*) from @tb)
begin
declare @WID INT
SET @WID = (select top 1 ID from @tb where ID in (select top (@i+1) ID from @tb) order by ID DESC)
IF(@WID=@ID)
begin
insert into @t
select top 1 * from @tb where ID in (select top (@i+1) ID from @tb) order by ID ASC
SET @WID = (select top 1 ID from @tb where ID in (select top (@i+1) ID from @tb) order by ID ASC)
end
ELSE
BEGIN
insert into @t
select top 1 * from @tb where ID in (select top (@i+1) ID from @tb) order by ID DESC
END
insert into @t select * from dbo.f_getChild(@WID)
set @ID = @WID
set @i = @i + 1
end
return
end
go
SELECT * FROM dbo.f_getChild(0)
------drop function f_getChild
ID PID LEVEL
---------- ---------- -----------
1 0 0
2 1 1
4 2 2
3 1 1
5 3 2
6 5 3
7 6 4
10 0 0
8 10 1
9 8 2
11 10 1
(11 row(s) affected)
如果想得到id为1的孩子列表: SELECT * FROM dbo.f_getChild(1)
- sql得到孩子节点列表
- sql通过一个节点ID得到所有子节点
- 得到孩子的幸福
- jQuery -> 获取孩子节点
- 删除孩子DOM节点
- SQL Server如何得到用户的继承列表
- [转]SQL Server如何得到用户的继承列表
- SQL Server如何得到用户的继承列表
- VB得到网絡中可用的SQL服務器列表
- 一条SQL语句得到树的父节点和子节点
- 删除元素的孩子节点
- 递归得到叶子节点。
- C#利用SQL-DMO得到(局域网中)SQL服务器的列表
- 得到应用列表
- android 得到应用列表
- silverlight删除Grid的孩子节点
- 线索树任意节点插入左右孩子
- wustoj(寻找根节点和孩子)
- IIS 6.0 Resource Kit Tools
- ASP.NET异步请求处理(Asynchronous Http Handlers)
- JFreeChart最新版本1.0.8a的研究系列——JFreeChart相关类和接口的方法说明
- AjaxPro与服务器端交互过程中如何传值
- 关于Linux内核源码使用
- sql得到孩子节点列表
- 2008年 新年来临 博客开放
- 关于锚的一点用法
- C语言的数组初始化
- Test
- 向大家推荐好的浏览器浏览csdn
- 一个老IT人的自白
- VB.NET2008中为datagridview加入下拉树列
- 布衣联盟装机常用软件光盘——金鼠报春版