求一生成路径的SQL语句

vfp_system 2006-10-11 08:34:32
表结构及数据如下:
Dept ParentDept
A0401 A0400
A0400 C0300
C0300 B0200
B0200 0
E0501 E0500
E0500 E0101
......


查询条件为Dept='A0401',要得到如下的数据
A0401
A0400
C0300
B0200
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
enterala 2006-10-11
  • 打赏
  • 举报
回复
学习
Well 2006-10-11
  • 打赏
  • 举报
回复
返回一个table
/*
用递归处理树型结构(表结构)
递归求城市,从小到大的,或从大到小。
*/
CREATE function GetTableDept(@iDeptID varchar(20))
returns @tDept table(Dept varchar(20))
as
begin
declare @vReturnValue nvarchar(1000)
,@iParentID varchar(20)
,@vCurrentDeptName nvarchar(200)
,@iEnd int
select @vReturnValue=''
,@vCurrentDeptName=''
,@iEnd=1

if(exists(select top 1 0 from PersonDept where Dept=@iDeptID and ParentDept='0'))
begin
set @iEnd=0
insert into @tDept(Dept) values(@vCurrentDeptName)
return
end

select @vCurrentDeptName=Dept
,@iParentID=ParentDept
from PersonDept
where Dept=@iDeptID

insert into @tDept(Dept) values(@vCurrentDeptName)
insert into @tDept(Dept) values(@iParentID)

while(2>1)
begin
select @iParentID=ParentDept
from PersonDept
where Dept=@iParentID

insert into @tDept(Dept) values(@iParentID)

if(exists(select top 1 0 from PersonDept where Dept=@iParentID and ParentDept='0'))
begin
break
end
if(not exists(select top 1 0 from PersonDept where Dept=@iParentID))
begin
break
end
end
return
end

----->

select * from dbo.GetTableDept('A0401')
copico 2006-10-11
  • 打赏
  • 举报
回复
上面有一点需要改进

/*
CREATE TABLE DD(
Dept varchar(10),
ParentDept varchar(10)
)
*/

CREATE TABLE #tempDD(
Dept varchar(10)
)

DECLARE @KEYWORD VARCHAR(10)

SET @KEYWORD = 'A0401'


WHILE (@KEYWORD <> 'ERROR')
BEGIN



IF EXISTS ( SELECT ParentDept FROM DD WHERE Dept = @KEYWORD )
BEGIN
INSERT INTO #tempDD VALUES(@KEYWORD)
SELECT @KEYWORD = ParentDept FROM DD WHERE Dept = @KEYWORD
END

ELSE
SET @KEYWORD = 'ERROR'
END

SELECT * FROM #tempDD


DROP TABLE #tempDD
copico 2006-10-11
  • 打赏
  • 举报
回复
CREATE TABLE #tempDD(
Dept varchar(10)
)

DECLARE @KEYWORD VARCHAR(10)

SET @KEYWORD = 'A0401'


WHILE (@KEYWORD <> 'ERROR')
BEGIN

INSERT INTO #tempDD VALUES(@KEYWORD)

IF EXISTS ( SELECT ParentDept FROM DD WHERE Dept = @KEYWORD )
SELECT @KEYWORD = ParentDept FROM DD WHERE Dept = @KEYWORD
ELSE
SET @KEYWORD = 'ERROR'
END

SELECT * FROM #tempDD


DROP TABLE #tempDD
Well 2006-10-11
  • 打赏
  • 举报
回复
--建立测试环境
create table PersonDept(Dept varchar(10),ParentDept varchar(10))
insert into PersonDept
select 'A0401','A0400' union all
select 'A0400','C0300' union all
select 'C0300','B0200' union all
select 'B0200','0' union all
select 'E0501','E0500' union all
select 'E0500','E0101'

--测试
--建立Function
/*
用递归处理树型结构(表结构)
递归求城市,从小到大的,或从大到小。
*/
CREATE function GetDept(@iDeptID varchar(20))
returns nvarchar(1000)
as
begin
declare @vReturnValue nvarchar(1000)
,@iParentID varchar(20)
,@vCurrentDeptName nvarchar(200)
select @vReturnValue=''
,@vCurrentDeptName=''
if(exists(select top 1 0 from PersonDept where Dept=@iDeptID and ParentDept='0'))
begin
select @vReturnValue=@vReturnValue+Dept
from PersonDept
where Dept=@iDeptID
and ParentDept='0'
end
else
begin
select @iParentID=ParentDept
,@vCurrentDeptName=Dept
from PersonDept
where Dept=@iDeptID
if(@vCurrentDeptName='')
begin
--set @vReturnValue=stuff(@vReturnValue,len(@vReturnValue),1,'')
set @vReturnValue=@vReturnValue+isnull(@iParentID,'')
--return(@vReturnValue)
end
else
begin
set @vReturnValue=@vReturnValue+@vCurrentDeptName+'-'+dbo.GetDept(@iParentID) --从子到父
end
--set @vReturnValue=@vReturnValue+dbo.GetDept(@iParentID)+'-'+@vCurrentDeptName --从父到子
end
return (@vReturnValue)
end

select *,dbo.GetDept(dept) AllDept from PersonDept
--显示结果
Dept ParentDept AllDept
A0401 A0400 A0401-A0400-C0300-B0200
A0400 C0300 A0400-C0300-B0200
C0300 B0200 C0300-B0200
B0200 0 B0200
E0501 E0500 E0501-E0500-
E0500 E0101 E0500-

--删除测试环境
drop table PersonDept
gahade 2006-10-11
  • 打赏
  • 举报
回复
create table t_1(dept varchar(10),parentdept varchar(10))
insert into t_1(dept,parentdept)
select 'A0401','A0400'
union all select 'A0400','C0300'
union all select 'C0300','B0200'
union all select 'B0200','0'
union all select 'E0501','E0500'
union all select 'E0500','E0101'

--递归取下级
create function f_getchild(@dept varchar(10))
returns @t table(dept varchar(10))
as
begin
declare @t_temp table(id int identity(1,1),child varchar(10))
insert into @t(dept)
select parentdept from t_1 where dept = @dept and parentdept<>'0'

insert into @t_temp(child)
select parentdept from t_1 where dept = @dept and parentdept<>'0'

declare @child_temp varchar(10),@max_id int,@min_id int
select @max_id = max(id),@min_id = min(id) from @t_temp
while @min_id <= @max_id
begin
select @child_temp = child from @t_temp where id = @min_id
insert into @t(dept)
select * from dbo.f_getchild(@child_temp)
select @min_id = @min_id + 1
end
return
end
--调用
select 'A0401'
union all
select dept from dbo.f_getchild('A0401')
DengXingJie 2006-10-11
  • 打赏
  • 举报
回复
這就像操作BOM表一樣
Well 2006-10-11
  • 打赏
  • 举报
回复
用递归可以做到。

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧