declare @TB_Category table (id int,ParentID int,name varchar(20))insert @TB_Category values(1,0,'Level1')
insert @TB_Category values(2, 1 , 'Level2A')
insert @TB_Category values(3, 1 , 'Level2B')
insert @TB_Category values(4, 2 , 'Level3A')
insert @TB_Category values(5, 3 , 'Level3B')
insert @TB_Category values(6,3 , 'Level3C')
declare @TB_Fee table (ID int,CategoryID int,Fee int)
insert @tb_fee values(1, 1 , 1)
insert @tb_fee values(2, 5 , 2)
insert @tb_fee values(3, 3 , 2)
insert @tb_fee values(4, 6 , 3)
insert @tb_fee values(5, 3 , 5)
insert @tb_fee values(6, 4 , 6)
insert @tb_fee values(7, 5 , 3)
insert @tb_fee values(8, 4 , 4)
insert @tb_fee values(9, 5 , 2)
insert @tb_fee values(10, 6 , 4)
insert @tb_fee values(11, 3 , 1)
insert @tb_fee values(12, 4 , 6)
insert @tb_fee values(13, 4 , 3)
insert @tb_fee values(14, 2 , 4)
insert @tb_fee values(15, 1 , 5)
insert @tb_fee values(16, 6 , 5)
insert @tb_fee values(17, 6 , 9)
declare @参数 varchar(100)
set @参数='Level1'declare @t table(id int,idm varchar(8000),level int)
declare @level int
set @level=1
insert @t select id,cast(id as varchar),@level from @TB_Category where name=@参数
while @@rowcount>0
begin
set @level=@level+1
insert @t select a.id,b.idm+','+cast(a.id as varchar),@level from @TB_Category a join @t b on a.ParentID=b.ID
where b.level=@level-1
endselect bb.*,[sum]=(select sum(CategoryID) from @tb_fee a join @t b on a.id=b.id where b.idm like aa.idm+'%')
from @t aa join @TB_Category bb on aa.id=bb.id
order by level/*id ParentID name sum
----------- ----------- -------------------- -----------
1 0 Level1 22
2 1 Level2A 11
3 1 Level2B 10
4 2 Level3A 6
5 3 Level3B 3
6 3 Level3C 4(所影响的行数为 6 行)
*/
insert @TB_Category values(2, 1 , 'Level2A')
insert @TB_Category values(3, 1 , 'Level2B')
insert @TB_Category values(4, 2 , 'Level3A')
insert @TB_Category values(5, 3 , 'Level3B')
insert @TB_Category values(6,3 , 'Level3C')
declare @TB_Fee table (ID int,CategoryID int,Fee int)
insert @tb_fee values(1, 1 , 1)
insert @tb_fee values(2, 5 , 2)
insert @tb_fee values(3, 3 , 2)
insert @tb_fee values(4, 6 , 3)
insert @tb_fee values(5, 3 , 5)
insert @tb_fee values(6, 4 , 6)
insert @tb_fee values(7, 5 , 3)
insert @tb_fee values(8, 4 , 4)
insert @tb_fee values(9, 5 , 2)
insert @tb_fee values(10, 6 , 4)
insert @tb_fee values(11, 3 , 1)
insert @tb_fee values(12, 4 , 6)
insert @tb_fee values(13, 4 , 3)
insert @tb_fee values(14, 2 , 4)
insert @tb_fee values(15, 1 , 5)
insert @tb_fee values(16, 6 , 5)
insert @tb_fee values(17, 6 , 9)
declare @参数 varchar(100)
set @参数='Level1'declare @t table(id int,idm varchar(8000),level int)
declare @level int
set @level=1
insert @t select id,cast(id as varchar),@level from @TB_Category where name=@参数
while @@rowcount>0
begin
set @level=@level+1
insert @t select a.id,b.idm+','+cast(a.id as varchar),@level from @TB_Category a join @t b on a.ParentID=b.ID
where b.level=@level-1
endselect bb.*,[sum]=(select sum(CategoryID) from @tb_fee a join @t b on a.id=b.id where b.idm like aa.idm+'%')
from @t aa join @TB_Category bb on aa.id=bb.id
order by level/*id ParentID name sum
----------- ----------- -------------------- -----------
1 0 Level1 22
2 1 Level2A 11
3 1 Level2B 10
4 2 Level3A 6
5 3 Level3B 3
6 3 Level3C 4(所影响的行数为 6 行)
*/
解决方案 »
- 如果使用sql语句建立一个自动编码主键并赋已有值?或把原主键设为自动编码
- 触发器的问题解惑
- 如何在存储过程中启动请求订阅
- 关于无法从SQL2012辅助节点读取最新数据的问题
- 关闭DMZ后无法连接数据库
- 如何在另一个存储过程返回的游标中查询我想要的记录?高手请进
- 如何查询数据包?
- 是否有这样的语句,就是可以清空库里所有的表里的记录,但不是删除表,而是清除表里的记录!
- sqlserver2008在windows8上的异常表现
- 存储过程里面比较纠结的逻辑问题,各位大神看看,在线等!
- 为什么从SQL6.5升级到2000的数据库补支持下面这个语句
- 为什么我新装的win2000server别的什么也没装,然后装sql2000企业版还是配置服务器失败,已经重装了3次系统了
set @参数='Level1'create proc 过程名
@参数 varchar(100)
asdeclare @tmp1 table (id int,ParentID int,name varchar(20),层次 varchar(1000))
insert @tmp1 select *,cast(id as varchar(10))+',' from TB_Category where name=@参数
while @@rowcount>0
insert @tmp1 select a.*,b.层次+cast(a.id as varchar(10))+',' from TB_Category a,@tmp1 b where a.ParentID=b.ID and a.ID not in (select ID from @tmp1)select a.id,a.name,(select sum(CategoryID) from TB_Fee where fee in (select id from @tmp1 where 层次 like a.层次+'%')) 结果 from @tmp1 a
go--调用
exec 过程名 'Level1'
也就是说第一行=第二行+第三行
为什么现在不相等?
id ParentID name sum
----------- ----------- -------------------- -----------
1 0 Level1 22
2 1 Level2A 11
3 1 Level2B 1022和11+10 ?
0自己也在你的TB_Fee 表里也有呀11+10+ 10<<==它自己的10
select bb.*,[sum]=(select sum(CategoryID) from @tb_fee a join @t b on a.id=b.id where b.idm like aa.idm+',%') --这里,原来来: +'%'
from @t aa join @TB_Category bb on aa.id=bb.id
order by level
/*--统计的结果,因为不包含自身,所以最末级无数据:
id ParentID name sum
----------- ----------- -------------------- -----------
1 0 Level1 21
2 1 Level2A 6
3 1 Level2B 7
4 2 Level3A NULL
5 3 Level3B NULL
6 3 Level3C NULL(所影响的行数为 6 行)
--*/