SQL 关于tree存储及提取的话题
来源:互联网 发布:数据球神 编辑:程序博客网 时间:2024/05/12 17:07
-- 总结关于tree在mssql中的存储、查询相关代码了。
set nocount on
go
create table bom (
code char(16) not null primary key
,parentcode char(16)
,name varchar(32)
,description varchar(512)
)
go
-- 指定代码的名称
create function dbo.fn_nameofcode (@code char(16))
returns varchar(32)
as begin
return isnull((select name from bom where code=@code),'')
end
go
-- 指定代码的上级代码
create function dbo.fn_parentcode (@code char(16))
returns char(16)
as begin
return isnull((select parentcode from bom where code=@code),'')
end
go
-- 指定代码的顶级代码
create function dbo.fn_topcode (@code char(16))
returns char(16)
as begin
declare @pcode char(16)
set @pcode=dbo.fn_parentcode(@code)
while @pcode > ''
begin
set @code=@pcode
set @pcode=dbo.fn_parentcode(@code)
end
return @code
end
go
-- 指定代码的路径代码
create function dbo.fn_codepath (@code char(16))
returns varchar(512)
as begin
declare @pcode char(16), @codepath varchar(512)
set @codepath=ltrim(rtrim(@code))
set @pcode=dbo.fn_parentcode(@code)
while @pcode > ''
begin
set @code=@pcode
set @codepath=ltrim(rtrim(@code))+'/'+@codepath
set @pcode=dbo.fn_parentcode(@code)
end
return @codepath
end
go
-- 指定代码的路径名称
create function dbo.fn_codenamepath (@code char(16))
returns varchar(512)
as begin
declare @pcode char(16), @namepath varchar(512)
set @namepath=dbo.fn_nameofcode(ltrim(rtrim(@code)))
set @pcode=dbo.fn_parentcode(@code)
while @pcode > ''
begin
set @code=@pcode
set @namepath=dbo.fn_nameofcode(ltrim(rtrim(@code)))+'/'+@namepath
set @pcode=dbo.fn_parentcode(@code)
end
return @namepath
end
go
-- 指定代码的所有下级条目
create function dbo.fn_subtreeofcode (@code char(16))
returns @subtree table (
code char(16)
,parentcode char(16)
,codepath varchar(512)
,name varchar(32)
,description varchar(512)
)
as begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom
where parentcode=@code
while @@rowcount>0
begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom a
where exists (select 1 from @subtree b where a.parentcode=b.code)
and not exists (select 1 from @subtree b where b.code=a.code)
end return
end
go
-- 指定代码的所有叶子
create function dbo.fn_leafeofcode (@code char(16))
returns @subtree table (
code char(16)
,parentcode char(16)
,codepath varchar(512)
,name varchar(32)
,description varchar(512)
)
as begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom
where parentcode=@code
while @@rowcount>0
begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom a
where exists (select 1 from @subtree b where a.parentcode=b.code)
and not exists (select 1 from @subtree b where b.code=a.code)
end
-- 删除所有存在下级条目的条目
delete from @subtree a
where exists(select 1 from @subtree b
where b.parentcode=a.code)
return
end
go
/**//**//**//* 一个例子,源自《这样的数据结构怎样设计TABLE最优》
* http://topic.csdn.net/u/20080419/13/3b181995-cbf1-4ab6-9101-90caf3953fd0.html
*/
-- 一级物料: 一级编号,一级物料名称,一级描述
insert into bom values ('A','','一种一级物料','物料A的描述')
insert into bom values ('B','','另一种一级物料','物料B的描述')
-- 二级物料:二级编号,二级物料名称,一级物料名称,二级描述
insert into bom values ('A01','A','二级物料','物料A01的描述')
insert into bom values ('A02','A','二级物料','物料A02的描述')
insert into bom values ('B01','B','二级物料','物料B01的描述')
insert into bom values ('B02','B','二级物料','物料B01的描述')
-- 三级物料:三级编号,三级料物名称,一级物料名称,二级物料名称,三级描述
insert into bom values ('B01-1','B01','三级物料','物料B01-1的描述')
insert into bom values ('B01-2','B01','三级物料','物料B01-2的描述')
insert into bom values ('B02-1','B02','三级物料','物料B02-1的描述')
-- 四级物料:四级编号,四级物料名称,一级物料名称,二级物料名称,三级物料名称,四级描述
insert into bom values ('B01-1.023','B01-1','四级物料','物料B01-1.023的描述')
insert into bom values ('B01-1.219','B01-1','四级物料','物料B01-1.219的描述')
insert into bom values ('B01-1.328','B01-1','四级物料','物料B01-1.328的描述')
insert into bom values ('B01-2.012','B01-2','四级物料','物料B01-2.012的描述')
go
select root = dbo.fn_topcode(code), path=dbo.fn_codepath(code), [|]='|', *
from bom
select *, namepath=dbo.fn_codenamepath(code)
from dbo.fn_subtreeofcode('B01')
order by codepath
go
drop function dbo.fn_nameofcode, dbo.fn_parentcode, dbo.fn_topcode, dbo.fn_codepath, dbo.fn_codenamepath
drop function dbo.fn_subtreeofcode
drop table bom
set nocount on
go
create table bom (
code char(16) not null primary key
,parentcode char(16)
,name varchar(32)
,description varchar(512)
)
go
-- 指定代码的名称
create function dbo.fn_nameofcode (@code char(16))
returns varchar(32)
as begin
return isnull((select name from bom where code=@code),'')
end
go
-- 指定代码的上级代码
create function dbo.fn_parentcode (@code char(16))
returns char(16)
as begin
return isnull((select parentcode from bom where code=@code),'')
end
go
-- 指定代码的顶级代码
create function dbo.fn_topcode (@code char(16))
returns char(16)
as begin
declare @pcode char(16)
set @pcode=dbo.fn_parentcode(@code)
while @pcode > ''
begin
set @code=@pcode
set @pcode=dbo.fn_parentcode(@code)
end
return @code
end
go
-- 指定代码的路径代码
create function dbo.fn_codepath (@code char(16))
returns varchar(512)
as begin
declare @pcode char(16), @codepath varchar(512)
set @codepath=ltrim(rtrim(@code))
set @pcode=dbo.fn_parentcode(@code)
while @pcode > ''
begin
set @code=@pcode
set @codepath=ltrim(rtrim(@code))+'/'+@codepath
set @pcode=dbo.fn_parentcode(@code)
end
return @codepath
end
go
-- 指定代码的路径名称
create function dbo.fn_codenamepath (@code char(16))
returns varchar(512)
as begin
declare @pcode char(16), @namepath varchar(512)
set @namepath=dbo.fn_nameofcode(ltrim(rtrim(@code)))
set @pcode=dbo.fn_parentcode(@code)
while @pcode > ''
begin
set @code=@pcode
set @namepath=dbo.fn_nameofcode(ltrim(rtrim(@code)))+'/'+@namepath
set @pcode=dbo.fn_parentcode(@code)
end
return @namepath
end
go
-- 指定代码的所有下级条目
create function dbo.fn_subtreeofcode (@code char(16))
returns @subtree table (
code char(16)
,parentcode char(16)
,codepath varchar(512)
,name varchar(32)
,description varchar(512)
)
as begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom
where parentcode=@code
while @@rowcount>0
begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom a
where exists (select 1 from @subtree b where a.parentcode=b.code)
and not exists (select 1 from @subtree b where b.code=a.code)
end return
end
go
-- 指定代码的所有叶子
create function dbo.fn_leafeofcode (@code char(16))
returns @subtree table (
code char(16)
,parentcode char(16)
,codepath varchar(512)
,name varchar(32)
,description varchar(512)
)
as begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom
where parentcode=@code
while @@rowcount>0
begin
insert into @subtree
select code, parentcode, codepath=dbo.fn_codepath(code), name, description
from bom a
where exists (select 1 from @subtree b where a.parentcode=b.code)
and not exists (select 1 from @subtree b where b.code=a.code)
end
-- 删除所有存在下级条目的条目
delete from @subtree a
where exists(select 1 from @subtree b
where b.parentcode=a.code)
return
end
go
/**//**//**//* 一个例子,源自《这样的数据结构怎样设计TABLE最优》
* http://topic.csdn.net/u/20080419/13/3b181995-cbf1-4ab6-9101-90caf3953fd0.html
*/
-- 一级物料: 一级编号,一级物料名称,一级描述
insert into bom values ('A','','一种一级物料','物料A的描述')
insert into bom values ('B','','另一种一级物料','物料B的描述')
-- 二级物料:二级编号,二级物料名称,一级物料名称,二级描述
insert into bom values ('A01','A','二级物料','物料A01的描述')
insert into bom values ('A02','A','二级物料','物料A02的描述')
insert into bom values ('B01','B','二级物料','物料B01的描述')
insert into bom values ('B02','B','二级物料','物料B01的描述')
-- 三级物料:三级编号,三级料物名称,一级物料名称,二级物料名称,三级描述
insert into bom values ('B01-1','B01','三级物料','物料B01-1的描述')
insert into bom values ('B01-2','B01','三级物料','物料B01-2的描述')
insert into bom values ('B02-1','B02','三级物料','物料B02-1的描述')
-- 四级物料:四级编号,四级物料名称,一级物料名称,二级物料名称,三级物料名称,四级描述
insert into bom values ('B01-1.023','B01-1','四级物料','物料B01-1.023的描述')
insert into bom values ('B01-1.219','B01-1','四级物料','物料B01-1.219的描述')
insert into bom values ('B01-1.328','B01-1','四级物料','物料B01-1.328的描述')
insert into bom values ('B01-2.012','B01-2','四级物料','物料B01-2.012的描述')
go
select root = dbo.fn_topcode(code), path=dbo.fn_codepath(code), [|]='|', *
from bom
select *, namepath=dbo.fn_codenamepath(code)
from dbo.fn_subtreeofcode('B01')
order by codepath
go
drop function dbo.fn_nameofcode, dbo.fn_parentcode, dbo.fn_topcode, dbo.fn_codepath, dbo.fn_codenamepath
drop function dbo.fn_subtreeofcode
drop table bom
- SQL 关于tree存储及提取的话题
- 关于IDE的话题
- 关于美丽的话题
- 关于创新的话题
- 关于缓存的话题
- 聊一聊分片存储的话题
- 关于关键词提取,摘要提取的,及文本相似总结
- 关于激进帐户的话题
- 关于婴儿机票的话题
- 关于汉语汉字的话题
- 关于自学的一些话题
- 关于div居中的话题
- 关于Core Dump的话题
- 关于代码对齐的话题
- 问题?关于家乡的话题!
- 关于c++的一些话题
- 关于素数的古老话题
- 关于 字符串中的单引号, 在sql存储过程中的传输总结; 逗号分隔的多个变量提取方法.
- [编程难题]编写一个求解时间满足约束的的算法.说明内详
- 读取RSS(支持目前所有RSS版本)
- Groovy Tip 6 集合类的简化操作
- http header详解
- asp.net(c#)给控件添加事件
- SQL 关于tree存储及提取的话题
- 20种好习惯 让你每天都快乐
- BREW是什么?
- http错误代码含义
- PE文件感染学习之一__通过现成代码加入一节信息来研究EXE文件的变化
- MFC app 界面乱码
- cisco硬件维修(交换机路由器防火墙模块电源维修)
- 人啊
- Loadrunner message函数详细分析