获取树形目录下某节点所有父类——要求代码简洁

振乾 2011-11-09 12:19:54

--作者:振乾
--环境: sql server 2008 R2
IF(OBJECT_ID('Company') IS not NULL)
DROP TABLE Company
CREATE TABLE Company
(
ID INT IDENTITY(1,1) PRIMARY KEY,
NAME VARCHAR(10),
ParentID INT,
Remark text
)
INSERT Company VALUES
('xx公司',0,''),
('研发部',1,''),
('销售部',1,''),
('张三',2,''),
('李四',3,''),
('王五',3,''),
('赵六',2,'')
SELECT * FROM company

--我的代码(正常通过)
declare @str varchar(100)
SET @str=''
;WITH CompanyStruct
AS
(
SELECT *,CAST(NULL AS VARCHAR(10)) AS ParentName FROM company WHERE id=2
UNION ALL
SELECT cp.*,CompanyStruct.name FROM company cp
INNER JOIN CompanyStruct ON cp.id=CompanyStruct.parentid
)
--SELECT * FROM CompanyStruct
SELECT @str=@str+'-'+NAME FROM companystruct ORDER BY parentid
PRINT STUFF(@str,1,1,'')

--比如 我查询 ID=7 的 张三 ,找到他上级所有的名称
最终的效果是:
xx公司-研发部

-----疑问:
大家有没有更简洁,更方便的代码来实现呢,请各位大牛多多指教!
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2011-11-09
  • 打赏
  • 举报
回复
你这个就是比较简单的了

sql 2005的CTE。
中国风 2011-11-09
  • 打赏
  • 举报
回复
用CTE可行以下方法

if object_id('Tree','U') is not null
drop table [Tree]
go
CREATE TABLE [dbo].[Tree](
[ID] [bigint] identity,
[Parent] as (ID-1),
[Name] as ('Name'+rtrim(ID))
)
go
declare @i int
set @i=35
while @i>0
begin
insert [tree] default values
set @i=@i-1
end
--生成格式:
/*
ID Parent Name
-------------------- -------------------- ----------------------------
1 0 Name1
2 1 Name2
3 2 Name3
4 3 Name4
5 4 Name5
6 5 Name6
7 6 Name7
8 7 Name8
9 8 Name9
10 9 Name10
................................................

................................................
31 30 Name31
32 31 Name32
33 32 Name33
34 33 Name34
35 34 Name35

*/
go
if object_id('F_BOM','FN') is not null
drop function F_BOM
go
create function F_BOM(@ID int)
returns nvarchar(1000)
as
begin
declare @s nvarchar(1000),@Name nvarchar(20)
lab:
set @Name =(select Name from Tree where ID=@ID)
select @ID=Parent from Tree where ID=@ID
if @Name is not null
begin
set @s=@Name+isnull('-'+@s,'')
goto lab
end
return @s
end


go
if object_id('F_BOM2','FN') is not null
drop function F_BOM2
go
create function F_BOM2(@ID int)
returns nvarchar(1000)
as
begin
declare @s nvarchar(1000)
while exists(select 1 from Tree where ID=@ID)
select @s=Name+isnull('-'+@s,''),@ID=Parent from Tree where ID=@ID
return @s
end
go
-晴天 2011-11-09
  • 打赏
  • 举报
回复
你已经很简洁了.
一般都用递归方式进行.
振乾 2011-11-09
  • 打赏
  • 举报
回复
谢谢 各位大牛。

34,588

社区成员

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

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