数据 为 :
10001 路容保洁 10000
10002 路面 10000
10003 路基 10000
10004 桥隧涵 10000
10005 沿线设施 10000
10006 机电设施 10000
10007 绿化 10000
10008 机械保洁 10001
10009 人工保洁 10001
10010 偶然事件 10001
10011 沥青砼路面 10002
10012 水泥砼路面 10002
10013 附属构造物 10002
10014 路基防护 10003
10015 路基水毁 10003
10016 路基排水 10003
10017 桥梁 10004
10018 涵洞 10004
10019 隧道 10004
10020 管理设施 10005
10021 安全防护设施 10005
10022 其他设施 10005
10023 桥面铺装 10017
10024 排水系统 10017
10025 附属设施 10017
10026 伸缩缝 10017
10027 翼墙锥坡 10017
10028 墩台 10017
10029 台帽盖梁 10017
10030 梁式构件 10017
10031 桥与路连接 10017
如何递归 形成自己的名字格式?
格式如下:
10023 桥隧涵-桥梁-桥面铺装
10024 桥隧涵-桥梁-排水系统
10025 桥隧涵-桥梁-附属设施
10026 桥隧涵-桥梁-伸缩缝
10027 桥隧涵-桥梁-翼墙锥坡
10028 桥隧涵-桥梁-墩台
10029 桥隧涵-桥梁-台帽盖梁
10030 桥隧涵-桥梁-梁式构件
10031 桥隧涵-桥梁-桥与路连接 我只想得到最底层的数据,名字显示方法 如格式中的那样~! 会的朋友来看看吧~!
10001 路容保洁 10000
10002 路面 10000
10003 路基 10000
10004 桥隧涵 10000
10005 沿线设施 10000
10006 机电设施 10000
10007 绿化 10000
10008 机械保洁 10001
10009 人工保洁 10001
10010 偶然事件 10001
10011 沥青砼路面 10002
10012 水泥砼路面 10002
10013 附属构造物 10002
10014 路基防护 10003
10015 路基水毁 10003
10016 路基排水 10003
10017 桥梁 10004
10018 涵洞 10004
10019 隧道 10004
10020 管理设施 10005
10021 安全防护设施 10005
10022 其他设施 10005
10023 桥面铺装 10017
10024 排水系统 10017
10025 附属设施 10017
10026 伸缩缝 10017
10027 翼墙锥坡 10017
10028 墩台 10017
10029 台帽盖梁 10017
10030 梁式构件 10017
10031 桥与路连接 10017
如何递归 形成自己的名字格式?
格式如下:
10023 桥隧涵-桥梁-桥面铺装
10024 桥隧涵-桥梁-排水系统
10025 桥隧涵-桥梁-附属设施
10026 桥隧涵-桥梁-伸缩缝
10027 桥隧涵-桥梁-翼墙锥坡
10028 桥隧涵-桥梁-墩台
10029 桥隧涵-桥梁-台帽盖梁
10030 桥隧涵-桥梁-梁式构件
10031 桥隧涵-桥梁-桥与路连接 我只想得到最底层的数据,名字显示方法 如格式中的那样~! 会的朋友来看看吧~!
从这里抄的
create table isc_catalog(nid int, npid int, ccategory char(10))
insert into isc_catalog values('1', '0', '中国')
insert into isc_catalog values('2', '1', '湖南省')
insert into isc_catalog values('3', '1', '广东省')
insert into isc_catalog values('4', '3', '广州市')
insert into isc_catalog values('5', '2', '长沙市')
insert into isc_catalog values('6', '4', '白云区')
insert into isc_catalog values('7', '5', '雨花区')
insert into isc_catalog values('8', '2', '娄底市')
insert into isc_catalog values('9', '1', '北京市')
insert into isc_catalog values('10', '6', '白云小区A')--新增一条记录
go
create function F_test(@nid int)
returns nvarchar(1000)
as
begin
declare @s nvarchar(1000),@npid int
select @s=rtrim(ccategory),@npid=npid from isc_catalog where nid=@nid
if @s is null
return null
return isnull(dbo.F_test(@npid)+',','')+@s --用,分隔
--@s+isnull('.'+dbo.F_test(@npid),'')
end
go--加一个分隔函数:
create function F_split(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int --分隔符长度
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND charindex(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
END
GOselect
dbo.F_split(dbo.F_test(nid),1,','),
coalesce(dbo.F_split(dbo.F_test(nid),2,','),dbo.F_split(dbo.F_test(nid),1,',')),
coalesce(dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
coalesce(dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
coalesce(dbo.F_split(dbo.F_test(nid),5,','),dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,','))
from
isc_catalog a
where
not exists(select 1 from isc_catalog where npid=a.nid)/*
中国 湖南省 长沙市 雨花区 雨花区
中国 湖南省 娄底市 娄底市 娄底市
中国 北京市 北京市 北京市 北京市
中国 广东省 广州市 白云区 白云小区A
*/--drop function F_split,F_test
--drop table isc_catalog
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-09-14 10:36:47
-------------------------------------
--> 生成测试数据: @tb
DECLARE @tb TABLE (id INT,name VARCHAR(12),parentid INT)
INSERT INTO @tb
SELECT 10001,'路容保洁',10000 UNION ALL
SELECT 10002,'路面',10000 UNION ALL
SELECT 10003,'路基',10000 UNION ALL
SELECT 10004,'桥隧涵',10000 UNION ALL
SELECT 10005,'沿线设施',10000 UNION ALL
SELECT 10006,'机电设施',10000 UNION ALL
SELECT 10007,'绿化',10000 UNION ALL
SELECT 10008,'机械保洁',10001 UNION ALL
SELECT 10009,'人工保洁',10001 UNION ALL
SELECT 10010,'偶然事件',10001 UNION ALL
SELECT 10011,'沥青砼路面',10002 UNION ALL
SELECT 10012,'水泥砼路面',10002 UNION ALL
SELECT 10013,'附属构造物',10002 UNION ALL
SELECT 10014,'路基防护',10003 UNION ALL
SELECT 10015,'路基水毁',10003 UNION ALL
SELECT 10016,'路基排水',10003 UNION ALL
SELECT 10017,'桥梁',10004 UNION ALL
SELECT 10018,'涵洞',10004 UNION ALL
SELECT 10019,'隧道',10004 UNION ALL
SELECT 10020,'管理设施',10005 UNION ALL
SELECT 10021,'安全防护设施',10005 UNION ALL
SELECT 10022,'其他设施',10005 UNION ALL
SELECT 10023,'桥面铺装',10017 UNION ALL
SELECT 10024,'排水系统',10017 UNION ALL
SELECT 10025,'附属设施',10017 UNION ALL
SELECT 10026,'伸缩缝',10017 UNION ALL
SELECT 10027,'翼墙锥坡',10017 UNION ALL
SELECT 10028,'墩台',10017 UNION ALL
SELECT 10029,'台帽盖梁',10017 UNION ALL
SELECT 10030,'梁式构件',10017 UNION ALL
SELECT 10031,'桥与路连接',10017--SQL查询如下:;WITH Liang AS
(
SELECT *,PATH = CONVERT(varchar(MAX),name),level = 1
FROM @tb AS A
WHERE NOT EXISTS(SELECT * FROM @tb WHERE A.parentid = id)
UNION ALL
SELECT A.*,CONVERT(varchar(MAX),B.PATH + '->' + A.name),level+1
FROM @tb AS A
JOIN Liang AS B
ON A.parentid = B.id
)
SELECT TOP 1 WITH TIES * FROM Liang AS A
ORDER BY level DESC/*
id name parentid PATH level
----------- ------------ ----------- ----------------- -----------
10023 桥面铺装 10017 桥隧涵->桥梁->桥面铺装 3
10024 排水系统 10017 桥隧涵->桥梁->排水系统 3
10025 附属设施 10017 桥隧涵->桥梁->附属设施 3
10026 伸缩缝 10017 桥隧涵->桥梁->伸缩缝 3
10027 翼墙锥坡 10017 桥隧涵->桥梁->翼墙锥坡 3
10028 墩台 10017 桥隧涵->桥梁->墩台 3
10029 台帽盖梁 10017 桥隧涵->桥梁->台帽盖梁 3
10030 梁式构件 10017 桥隧涵->桥梁->梁式构件 3
10031 桥与路连接 10017 桥隧涵->桥梁->桥与路连接 3(9 行受影响)
*/
(
SELECT *,PATH = CONVERT(varchar(MAX),name),level = 1
FROM @tb AS A
WHERE NOT EXISTS(SELECT * FROM @tb WHERE A.parentid = id)
UNION ALL
SELECT A.*,CONVERT(varchar(MAX),B.PATH + '->' + A.name),level+1
FROM @tb AS A
JOIN Liang AS B
ON A.parentid = B.id
)
SELECT TOP 1 WITH TIES * FROM Liang AS A
ORDER BY level DESC
是不是 少点东西呀?
有QQ吗 加 我 QQ :263306005 在帖子中我只能回复三次
(
select id,pid,name,0 as order from tb a where not exists
(select * from tb where pid=a.id)
union all
select id,pid,name,order+1 from tb a join cte b on b.pid=a.id
)
如果是SQL SERVER 2005可以直接使用上面的代码.
如果是SQL SERVER 2000,则不可以.
INSERT INTO isc_catalog
SELECT 10001 ,'路容保洁', 10000 UNION ALL
SELECT 10002 ,'路面', 10000 UNION ALL
SELECT 10003 ,'路基', 10000 UNION ALL
SELECT 10004 ,'桥隧涵', 10000 UNION ALL
SELECT 10005 ,'沿线设施', 10000 UNION ALL
SELECT 10006 ,'机电设施', 10000 UNION ALL
SELECT 10007 ,'绿化', 10000 UNION ALL
SELECT 10008 ,'机械保洁', 10001 UNION ALL
SELECT 10009 ,'人工保洁', 10001 UNION ALL
SELECT 10010 ,'偶然事件', 10001 UNION ALL
SELECT 10011 ,'沥青砼路面', 10002 UNION ALL
SELECT 10012 ,'水泥砼路面', 10002 UNION ALL
SELECT 10013 ,'附属构造物', 10002 UNION ALL
SELECT 10014 ,'路基防护', 10003 UNION ALL
SELECT 10015 ,'路基水毁', 10003 UNION ALL
SELECT 10016 ,'路基排水', 10003 UNION ALL
SELECT 10017 ,'桥梁', 10004 UNION ALL
SELECT 10018 ,'涵洞', 10004 UNION ALL
SELECT 10019 ,'隧道', 10004 UNION ALL
SELECT 10020 ,'管理设施', 10005 UNION ALL
SELECT 10021 ,'安全防护设施', 10005 UNION ALL
SELECT 10022 ,'其他设施', 10005 UNION ALL
SELECT 10023 ,'桥面铺装', 10017 UNION ALL
SELECT 10024 ,'排水系统', 10017 UNION ALL
SELECT 10025 ,'附属设施', 10017 UNION ALL
SELECT 10026 ,'伸缩缝', 10017 UNION ALL
SELECT 10027 ,'翼墙锥坡', 10017 UNION ALL
SELECT 10028 ,'墩台', 10017 UNION ALL
SELECT 10029 ,'台帽盖梁', 10017 UNION ALL
SELECT 10030 ,'梁式构件', 10017 UNION ALL
SELECT 10031 ,'桥与路连接', 10017
go
create function F_test(@nid int)
returns nvarchar(1000)
as
begin
declare @s nvarchar(1000),@npid int
select @s=rtrim(ccategory),@npid=npid from isc_catalog where nid=@nid
if @s is null
return null
return isnull(dbo.F_test(@npid)+'-','')+@s --用-分隔
--@s+isnull('.'+dbo.F_test(@npid),'')
end
go--加一个分隔函数:
create function F_split(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int --分隔符长度
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND charindex(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
END
GOselect
dbo.F_split(dbo.F_test(nid),1,'-'),
coalesce(dbo.F_split(dbo.F_test(nid),2,'-'),dbo.F_split(dbo.F_test(nid),1,'-')),
coalesce(dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-')),
coalesce(dbo.F_split(dbo.F_test(nid),4,'-'),dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-')),
coalesce(dbo.F_split(dbo.F_test(nid),5,'-'),dbo.F_split(dbo.F_test(nid),4,'-'),dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-'))
from
isc_catalog a
where
not exists(select 1 from isc_catalog where npid=a.nid)
AND coalesce(dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-')) IS NOT NULL
AND coalesce(dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-'))<>
coalesce(dbo.F_split(dbo.F_test(nid),2,'-'),dbo.F_split(dbo.F_test(nid),1,'-'))/*
桥隧涵 桥梁 桥面铺装 桥面铺装 桥面铺装
桥隧涵 桥梁 排水系统 排水系统 排水系统
桥隧涵 桥梁 附属设施 附属设施 附属设施
桥隧涵 桥梁 伸缩缝 伸缩缝 伸缩缝
桥隧涵 桥梁 翼墙锥坡 翼墙锥坡 翼墙锥坡
桥隧涵 桥梁 墩台 墩台 墩台
桥隧涵 桥梁 台帽盖梁 台帽盖梁 台帽盖梁
桥隧涵 桥梁 梁式构件 梁式构件 梁式构件
桥隧涵 桥梁 桥与路连接 桥与路连接 桥与路连接
*/drop function F_split,F_test
drop table isc_catalog
(
SELECT *,PATH = CONVERT(varchar(MAX),name),level = 1
FROM @tb AS A
WHERE NOT EXISTS(SELECT * FROM @tb WHERE A.parentid = id)
UNION ALL
SELECT A.*,CONVERT(varchar(MAX),B.PATH + '->' + A.name),level+1
FROM @tb AS A
JOIN Liang AS B
ON A.parentid = B.id
)
SELECT TOP 1 WITH TIES * FROM Liang AS A
ORDER BY level DESC
上边一段 ;WITH Liang AS 我看不明白
WITH BT_Category AS
(
SELECT *,CategoryName = CONVERT(varchar(MAX),CategoryName),level = 1
FROM BT_Category AS A
WHERE NOT EXISTS(SELECT * FROM BT_Category WHERE A.FCategoryCode = CategoryCode)
UNION ALL
SELECT A.*,CONVERT(varchar(MAX),B.CategoryName + '->' + A.CategoryName),level+1
FROM BT_Category AS A inner
JOIN BT_Category AS B
ON A.FCategoryCode = B.CategoryCode
)
SELECT TOP 1 WITH TIES * FROM BT_Category AS A
ORDER BY level DESC
消息 246,级别 16,状态 1,第 2 行
没有为递归查询 "BT_Category" 指定任何定位点成员。
(
SELECT *,CategoryName = CONVERT(varchar(MAX),CategoryName),level = 1
FROM BT_Category AS A
WHERE NOT EXISTS(SELECT * FROM BT_Category WHERE A.FCategoryCode = CategoryCode)
UNION ALL
SELECT A.*,CONVERT(varchar(MAX),B.CategoryName + '->' + A.CategoryName),level+1
FROM BT_Category AS A
JOIN Liang AS B
ON A.FCategoryCode = B.CategoryCode)
SELECT TOP 1 WITH TIES * FROM Liang AS A
ORDER BY level DESC/*
id name parentid PATH level
----------- ------------ ----------- ----------------- -----------
10023 桥面铺装 10017 桥梁->桥面铺装 4
10024 排水系统 10017 桥梁->排水系统 4
10025 附属设施 10017 桥梁->附属设施 4
10026 伸缩缝 10017 桥梁->伸缩缝 4
10027 翼墙锥坡 10017 桥梁->翼墙锥坡 4
10028 墩台 10017 桥梁->墩台 4
10029 台帽盖梁 10017 桥梁->台帽盖梁 4
10030 梁式构件 10017 桥梁->梁式构件 4
10031 桥与路连接 10017 桥梁->桥与路连接 4(9 行受影响)
*/结果 和你的 不一样 这是为什么???