首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么让一个表返回树结构的数据

2012-01-14 
如何让一个表返回树结构的数据IDNOParentNO1BA2CA4B1B5B2B6C1C7C1-1C1比如我查询A返回B,C,B1,B2,C1,C-1[解

如何让一个表返回树结构的数据
ID NO ParentNO
1BA
2CA
4B1B
5B2B
6C1C
7C1-1C1


比如我查询A返回
B,C,B1,B2,C1,C-1

[解决办法]

SQL code
--树形数据编号重排示例--测试数据DECLARE @t TABLE(No varchar(10))INSERT @t SELECT '1'UNION ALL SELECT '3'UNION ALL SELECT '302'UNION ALL SELECT '305'UNION ALL SELECT '305001'UNION ALL SELECT '305005'UNION ALL SELECT '6'UNION ALL SELECT '601'--重排编码UPDATE a SET     No=RIGHT(--重排第一层编码            (SELECT COUNT(DISTINCT No) FROM @t WHERE No<=a.No AND LEN(No)=1),1)        +CASE --重排第二层编码            WHEN LEN(No)>1             THEN RIGHT(100+                (SELECT COUNT(DISTINCT No) FROM @t WHERE No<=a.No AND No LIKE LEFT(a.NO,1)+'__'),2)            ELSE '' END        +CASE --重排第三层编码            WHEN LEN(No)>3            THEN RIGHT(1000+                (SELECT COUNT(DISTINCT No) FROM @t WHERE No<=a.No AND No LIKE LEFT(a.NO,3)+'___'),3)            ELSE '' ENDFROM @t a--显示处理结果SELECT * FROM @t/*--结果No         ---------- 122012022020012020023301--*/
[解决办法]
SQL code
-- 树形数据层次显示处理示例--测试数据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 intSET @Level=0INSERT @t_Level SELECT ID,@Level,IDFROM @tWHERE PID IS NULLWHILE @@ROWCOUNT>0BEGIN    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-1END--显示结果SELECT SPACE(b.Level*2)+'|--'+a.NameFROM @t a,@t_Level bWHERE a.ID=b.IDORDER BY b.Sort/*--结果|--山东省  |--烟台市    |--招远市  |--青岛市|--四会市  |--清远市    |--小分市--*/
[解决办法]
SQL code
-- 树形数据深度排序处理示例(递归法)--测试数据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)ASBEGIN    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    RETURNENDGO--显示结果SELECT a.*FROM tb a,f_Sort(DEFAULT,DEFAULT) bWHERE a.ID=b.IDORDER BY b.sort/*--结果ID   PID   Name       ------ --------- ---------- 001  NULL 山东省002  001   烟台市004  002   招远市003  001   青岛市005  NULL 四会市006  005   清远市007  006   小分市--*/
[解决办法]
列子:
http://blog.csdn.net/roy_88/archive/2006/12/24/1458449.aspx
[解决办法]
SQL code
--网上列子一堆,还是给楼主的数据写一下列子..create table T(ID int,             [NO] nvarchar(10),            ParentNO nvarchar(10))insert T select 1, 'B', 'A' insert T select 2, 'C', 'A' insert T select 4, 'B1', 'B' insert T select 5, 'B2', 'B' insert T select 6, 'C1', 'C' insert T select 7, 'C1-1', 'C1' go--drop table Tcreate function F_tree(@ParentNO nvarchar(5))returns nvarchar(100)asbegindeclare @s nvarchar(100),@i intdeclare @T table([NO] nvarchar(5),[ParentNO] nvarchar(5),lev int)set @i=0insert @T select [NO],[ParentNO],@i from T where ParentNO=@ParentNOwhile @@rowcount>0    begin        set @i=@i+1        insert @T select a.[NO],a.[ParentNO],@i from T a join @T b on a.ParentNO=b.[NO] and b.lev=@i-1    endselect @s=isnull(@s+',','')+[NO] from @Treturn @sendgoselect dbo.F_tree('A')                                                                                                     ---------------------------------------------------------------- B,C,B1,B2,C1,C1-1(所影响的行数为 1 行) 


[解决办法]

SQL code
--用一临时表保存中间结果.与层次declare @tmp table (layer int,no varchar(10))declare @layer int,@no varchar(10)set @no='A'set @layer=0if exists(select * from 表 where parentno=@no)    insert into @tmp (layer,no) select @layer,no from 表 where parentno=@nowhile exists(select * from 表 a,@tmp b where a.parentno=b.no and b.layer=@layer)begin    insert into @tmp (layer,no) select @layer+1,a.no from 表 a,@tmp b where a.parentno=b.no and b.layer=@layer    set @layer=@layer+1endselect * from @tmp 

热点排行