http://expert.csdn.net/Expert/topic/2285/2285830.xml?temp=.1570551/*--树形数据处理方案 树形数据的排序,新增,修改,复制,删除,数据完整性检查,汇总统计
--邹建 2003.9--*/
--邹建 2003.9--*/
解决方案 »
- 问一个关于触发器的问题
- 一个select语句把结果集在一行显示的语句怎么写。 以前有人告诉我过了, 但帖子找不到了。
- 两台笔记本电脑,通过红外线无线连接后,sql server 2000连接不上,怎么解决?
- 用guid字符串作主键,用char(36)好还是用uniqueidentifier好?
- SQLServer常见查询问题
- 求助数据库设计
- SQL Server Enterprise Manager怎么不能用啊??
- 菜鸟提问
- SQL 进程问题!急!!!!!!!!!!!!!!!!
- 再问:为什么我在使用SQLDMO进行异地备份数据库时,总提示出错(我使用的)。在线等待,急!
- 大力帮忙 问题:我认为比较经典的问题?特别是(3)
- 关于表格格式转换的难题,在线等,SOS!!!!!
FuncNo ParentNo
-------------------- --------------------
A
B
3A A
C A
55 B
77 B
MM B
HB 3A
BB 3A
DD C
FF C
AH 55
7B 55
4A 77
8F 77
GG 77
LL MM
H DD
3C 7B
也就是树状结构,由于不好画,你可以试着画一下,A,B为最头结点其实我的数据并不是真的数据,这只是我测试用的数据,其是就是一种遍历的问题.我需要的结果一定是要根据FuncNo和ParentNo的数据来进行排序,因为这些测试数据并不是真的数据它会改变,只能根据FuncNo和ParentNo的数据来得到结果,谢谢关注.
FuncNo ParentNo
-------------------- --------------------
A
3A A
HB 3A
BB 3A
C A
DD C
H DD
FF C
B
55 B
AH 55
7B 55
3C 7B
77 B
4A 77
8F 77
GG 77
MM B
LL MM
id int(自动增加)
aaa varchar(节点名称)节点结构表:
id int(自动增加)
id2 int(节点列表的id)
bbb varchar(子节点名称) or id3 int(子节点id)这种结构比较合理,查询也比较方便,而且可以实现无级扩展
create table t(FuncNo varchar(10),ParentNo varchar(10))insert t select 'A',null
union all select 'B',null
union all select '3A','A'
union all select 'C','A'
union all select '55','B'
union all select '77','B'
union all select 'MM','B'
union all select 'HB','3A'
union all select 'BB','3A'
union all select 'DD','C'
union all select 'FF','C'
union all select 'AH','55'
union all select '7B','55'
union all select '4A','77'
union all select '8F','77'
union all select 'GG','77'
union all select 'LL','MM'
union all select 'H','DD'
union all select '3C','7B'/*=========================================================*/select identity(int,1,1) as id,cast('' as varchar(100)) as id2,* into #t from t where ParentNo is null order by FuncNoupdate #t set id2='000'+rtrim(id)while exists
(
select 1
from t A,#t B
where B.FuncNo=A.ParentNo
and not exists(
select 1
from #t
where ParentNo=A.parentNo
and FuncNo=A.FuncNo)
)insert #t select id2+right('000'+rtrim(No),4),
FuncNo,
ParentNo
from (
select A.*,
B.id2,
(select count(*) as No
from t
where ParentNo=A.ParentNo
and FuncNo<=A.FuncNo) No
from t A,#t B
where B.FuncNo=A.ParentNo
and not exists (select 1
from #t
where ParentNo=A.parentNo
and FuncNo=A.FuncNo)
) Cselect FuncNo,ParentNo from #t order by id2drop table #t
drop table t/*=========================================================
FuncNo ParentNo
---------- ----------
A NULL
3A A
BB 3A
HB 3A
C A
DD C
H DD
FF C
B NULL
55 B
7B 55
3C 7B
AH 55
77 B
4A 77
8F 77
GG 77
MM B
LL MM
==========================================================*/