有一张表,表有两个字段,分别为A 和B ;里面的数据为:a1,b1
a2,b1
a3,b2
b2,c1
c1,c2
c2,c3
a1,b2
a2,b2
……也就是说A里面的节点归属于B字段里的,可以无限嵌套,也可以只嵌套一层。现在需要将其显示为树状结构,怎么实现?
c3-c2
--c1
---b2
----a1
----a2
----a3
b1-a1
-a2
a2,b1
a3,b2
b2,c1
c1,c2
c2,c3
a1,b2
a2,b2
……也就是说A里面的节点归属于B字段里的,可以无限嵌套,也可以只嵌套一层。现在需要将其显示为树状结构,怎么实现?
c3-c2
--c1
---b2
----a1
----a2
----a3
b1-a1
-a2
解决方案 »
- SQLserver怎样存储格式为年月日的时间类型
- 数据汇总
- 用log explorer 恢复删除的数据表,提示 getrow() NUll
- 菜鸟的问题,就两个表,怎么更新?快来抢分!!!
- 简单的问题,关于删除重复记录
- 难问题啊,整个数据库中搜索一个字符串或数字,如何做,有没有相关程序或存储过程?
- 如何在表中定义一个自动增长的列?
- VB中如何将SQL SERVER数据一起打包?(一定给分)
- SQLOLEDB无法启动分布式事务,请问在触发器中如何向远程数据库写值?在线等待50分!
- 高级问题:如何在一个触发器或者存储过程中得知自己是否处在一个事务之中?
- 怎么确定数字的长度?
- 表变量在服务器负担很重的情况下会发生错误吗
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'--广度排序显示处理
--生成每个节点的层次数据
DECLARE @t_Level TABLE(ID char(3),Level int)
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Level,b.ID
/*--结果
ID PID Name
------- --------- ----------
001 NULL 山东省
005 NULL 四会市
002 001 烟台市
003 001 青岛市
006 005 清远市
004 002 招远市
007 006 小分市
--*/
--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GO--广度搜索排序函数
CREATE FUNCTION f_Sort(@ID char(3)=NULL,@sort int=1)
RETURNS @t_Level TABLE(ID char(3),sort int)
AS
BEGIN
DECLARE tb CURSOR LOCAL
FOR
SELECT ID FROM tb
WHERE PID=@ID
OR(@ID IS NULL AND PID IS NULL)
OPEN TB
FETCH tb INTO @ID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT @t_Level VALUES(@ID,@sort)
SET @sort=@sort+1
IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
BEGIN
--递归查找当前节点的子节点
INSERT @t_Level SELECT * FROM f_Sort(@ID,@sort)
SET @sort=@sort+@@ROWCOUNT --排序号加上子节点个数
END
FETCH tb INTO @ID
END
RETURN
END
GO--显示结果
SELECT a.*
FROM tb a,f_Sort(DEFAULT,DEFAULT) b
WHERE a.ID=b.ID
ORDER BY b.sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/
ID,PID对应你的A,B字段
DECLARE @t TABLE(ID char(3),PID char(3))
INSERT @t SELECT 'a1', 'b1'
UNION ALL SELECT 'a2', 'b1'
UNION ALL SELECT 'a3', 'b2'
UNION ALL SELECT 'b2', 'c1'
UNION ALL SELECT 'c1', 'c2'
UNION ALL SELECT 'c2', 'c3'
UNION ALL SELECT 'a1', 'b2'
UNION ALL SELECT 'a2', 'b2'--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
--WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.PID
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--b1
|--b2
|--b1
|--b2
|--b1
|--b2
|--b1
|--b2
|--b2
|--c1
|--b1
|--b2
|--b1
|--b2
|--b2
|--c2
|--c1
|--b1
|--b2
|--b1
|--b2
|--b2
|--c3
|--c2
|--c1
|--b1
|--b2
|--b1
|--b2
|--b2
--*/貌似结果也不是我要的..我再看下吧,谢谢.