日期:2014-05-18  浏览次数:20503 次

头疼呀 1个礼拜了还没有解决
我用左连接做树状查询,查询出个人上级的层次级别(7-1),最小层次级别为7、最大1、条件是用本级中的父级ID,连接上一级的用户ID,从而得到上一级的层次级别。如果数据库中的数据完整时,那么查出来的数据,会从7级一直查找到1级。

select 
g.Level as f1,f.Level as f2,e.Level as f3,d.Level as f4,c.Level as f5,b.Level as f6,a.Level as f7
from user A 
left outer join user B on A.ParentID=B.UserID
left outer join user C on B.ParentID=C.UserID
left outer join user D on C.ParentID=D.UserID
left outer join user E on D.ParentID=E.UserID
left outer join user F on E.ParentID=F.UserID
left outer join user G on F.ParentID=G.UserID

如果在某一级当中,本级中的父级ID连接上一级时不成立时(注意:上一级的整条数据不存在),同样会一直查询下去,但得出的数据会错位,如找的层次级别为7,上一级的层次级别本应为6,但是因为数据不存在,所以就把层次级别为5的数据放到6级层次级别中,依次下去后面的数据就全错位了,求解!
只需要查出来的数据,与上面的字段相对应不会出现错为就可以了

------解决方案--------------------
SQL code

if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([modeid] int,modename varchar(20),parentid int)
insert [tb]
select 100 ,'商品管理', 0 union all
select 101 ,'定单管理', 0 union all
select 102 ,'用户管理', 0 union all
select 104 ,'学院广告', 0 union all
select 105 ,'系统设置', 0 union all
select 106 ,'附件管理', 0 union all
select 107 ,'商品管理', 100 union all
select 108 ,'明细管理', 100 union all
select 109 ,'物流管理', 100 union all
select 110 ,'商品信息管理', 107 union all
select 111 ,'商品分类管理', 107 union all
select 112 ,'回收站管理', 107 union all
select 114 ,'团购管理', 108 union all
select 115 ,'拍卖管理', 108 union all
select 116 ,'优惠管理', 108 union all
select 117 ,'会员管理', 102 union all
select 118 ,'会员卡管理', 102 union all
select 119 ,'资金管理', 102 union all
select 120 ,'管理员管理', 102 union all
select 121 ,'添加管理员', 120 union all
select 122 ,'修改管理员', 120
go


--查所有子结点
if object_id('f_getC') is not null drop function f_getC
go
create function f_getC(@id int) 
returns @re table(id int,level int,sort varchar(10)) 
as 
begin
    declare @l int 
    set @l=0 
    insert @re select @id,@l,null
    while @@rowcount>0
    begin 
        set @l=@l+1
        insert @re select a.modeid,@l,ltrim(isnull(b.sort,a.modeid)) from tb as a,@re as b 
 where b.id=a.parentid and b.level=@l-1
    end
    update @re set level = level -1
    return 
end 
go 


select a.modeid,a.parentid,REPLICATE('  ',b.level) +'┝'+a.modename,b.level,b.sort from tb  a,f_getC(0) b 
where a.modeid=b.id 
order by case when b.level<2 then 0 else 1 end,b.sort,b.level

/*
modeid      parentid                                                       sort       level      
----------- ----------- -------------------------------------------------- ---------- -----------
100         0           ┝商品管理                                              100        0
107         100           ┝商品管理                                            100        1
108         100           ┝明细管理                                            100        1
109         100           ┝物流管理                                            100        1
101         0           ┝定单管理                                              101        0
102         0           ┝用户管理                                              102        0
117         102           ┝会员管理                                            102        1
118         102           ┝会员卡管理                                           102        1
119         102           ┝资金管理                                            102        1
120         102           ┝管理员管理                                           102        1
104         0           ┝学院广告                                              104        0
105         0           ┝系统设置                                              105        0
106         0           ┝附件管理                                              106        0
110         107             ┝商品信息管理                                        100        2
111         107             ┝商品分类管理                                        100        2
112         107             ┝回收站管理                                         100