200分求助!SQL递归查询所有子节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了200分求助!SQL递归查询所有子节点相关的知识,希望对你有一定的参考价值。

id: 目录ID,upid: 上级目录ID,name: 目录名称 单表的
----------------------------------------
id upid name
----------------------------------------
1 0 中国
2 1 湖北
3 1 湖南
4 2 武汉
5 2 宜昌
6 3 长沙
7 3 岳阳
......
-----------------------------------------
通过SQL查询出来的结果:
-----------------------------------------
中国 -> 湖北 -> 武汉
中国 -> 湖北 -> 宜昌

中国 -> 湖南 -> 长沙
中国 -> 湖南 -> 岳阳

我要把数据都取出来,放进xml文件生成树形菜单,大家指点下,打得好的话有多少分给多少分

刷新下!兄弟们高效啊,内牛满面中。。。。

2楼的 MuCloudLi兄弟能不能稍微对照我的表结构解释下啊,本人较菜,嘿嘿!

CREATE PROCEDURE [dbo].[SetColGroup](@sColItemCode VARCHAR(50),@ReportID VARCHAR(50) )
AS
-- 获取ItemCode对应的GroupCode,并更新至临时表中
BEGIN

DECLARE @sSQL VARCHAR(1000)
DECLARE @colGroupCode VARCHAR(50)
DECLARE @SuperColItemCode VARCHAR(50)
DECLARE @colSuperGroupCode VARCHAR(50)

--获取下一级别的数据(这里的SuperColItemCode实际上是下一级数据)
DECLARE curGroupCodeTmp CURSOR LOCAL FOR
SELECT c.ColGroupCode,b.SuperColItemCode,d.ColGroupCode AS ColSuperGroupCode
FROM dbo.ReportItemCross b
INNER JOIN dbo.ReportColItem c ON b.ColItemCode = c.ColItemCode
INNER JOIN dbo.ReportColItem d ON b.SuperColItemCode = d.ColItemCode
WHERE b.ColItemCode = @sColItemCode AND b.ReportID = @ReportID
OPEN curGroupCodeTmp
FETCH NEXT FROM curGroupCodeTmp
INTO @colGroupCode,@SuperColItemCode,@colSuperGroupCode
WHILE @@FETCH_STATUS = 0
BEGIN
--此处进行实际数据处理
IF(ISNULL(@colGroupCode,'')<>'' AND ISNULL(@colSuperGroupCode,'')<>'')
SET @sSQL = 'update ##tmp set ' + @colSuperGroupCode + ' = ''' + @SuperColItemCode
+ ''' where ' + @colGroupCode + ' = ''' + @sColItemCode + ''''
EXECUTE(@sSQL)
--根据条件判断是否结束递归
IF(ISNULL(@SuperColItemCode,'') <> '')
EXEC SetColGroup @SuperColItemCode,@ReportID
FETCH NEXT FROM curGroupCodeTmp
INTO @colGroupCode,@SuperColItemCode,@colSuperGroupCode
END

CLOSE curGroupCodeTmp
DEALLOCATE curGroupCodeTmp

END
参考技术A 不知你问的什么意思,还请说详细一点,是查询表还是其他对象的结点。如果是表可以使用start with .. connect by 来实现,比如下面是查询所有在king管理下的员工层级关系:

scott@ORCL>select lpad(' ',level+1,' ')||ename as ename,level from emp start with ename='KING' connect by prior empno=mgr;

ENAME LEVEL
---------- ----------
KING 1
BLAKE 2
MARTIN 3
ALLEN 3
TURNER 3
JAMES 3
WARD 3
CLARK 2
MILLER 3
JONES 2
FORD 3
SMITH 4
TEST 3
ADAMS 4

其中level是此记录在树结构表中的层级,建议还是把问题补充清楚,谢谢。

对呀,起码要给出表结构,这样回答都才可以针对这个来做。

那么这条语句可以参照我的这个写法:

scott@ORCL>select ltrim(sys_connect_by_path(ename,'-->'),'-->') from emp start with ename='KING' connect by prior empno=mgr;

LTRIM(SYS_CONNECT_BY_PATH(ENAME,'-->'),'-->')
-----------------------------------------------------------------------------------------------------------------------------------------

KING
KING-->BLAKE
KING-->BLAKE-->MARTIN
KING-->BLAKE-->ALLEN
KING-->BLAKE-->TURNER
KING-->BLAKE-->JAMES
KING-->BLAKE-->WARD
KING-->CLARK
KING-->CLARK-->MILLER
KING-->JONES
KING-->JONES-->FORD
KING-->JONES-->FORD-->SMITH
KING-->JONES-->TEST
KING-->JONES-->TEST-->ADAMS
参考技术B 用自连接!
select a.name+'->'+b.name+'->'+c.name
from tablename a left join tablename b on a.id=b.upid
left join tablename c on b.id=c.upid
where a.upid=0;

tablename-----你的表名。

你试下,肯定是你想要的结果。

层次确定的情况下没必要用递归,效率低!
参考技术C 三楼,为什么?

楼主,你解题的方向有错!你会所有xml生成菜单树,就不用会数据库生成菜单树?难道就是因为在框架中有xml生成的操作?试想,先将数据库的内容取出,然后生成xml,然后程序再取xml生成菜单树!为什么不直接使用数据库生成菜单树?难道你也用缓存不成?

二楼的代码我还真没有看懂!杨杨洒洒一个存储过程,生成中间的临时表,里边还用上了游标,其实在游标的使用上我们如果是对单个数据使用或是无可避免时使用,尽量都不使用的,因为fetch效果太低了!

select a.name+"->"+b.name+"->"+c.name as name from tablename a,tablename b,tablename c where a.upid = 0 and b.upid = a.id and c.upid = b.id

这个语句生成楼主要求的形式,但xml文件也不是这么写的!
参考技术D 前提确保没有第四层数据,否则执行肯定不通过

就是只有国-省-市

select a.name1,a.name2,b.name2 from
(select distinct a.name name1,b.name name2 from t a,t b,t c where b.upid=a.id) a,
(select distinct a.name name1,b.name name2 from t a,t b,t c where b.upid=a.id) b
where a.name2=b.name1

T-Sql 递归查询(给定节点查所有父节点所有子节点的方法)

-- 查找所有父节点
with tab as
(
 select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316--子节点
 union all
 select b.Type_Id,b.ParentId,b.Type_Name 
 from
  tab a,--子节点数据集
  Sys_ParamType_V2_0 b  --父节点数据集
 where a.ParentId=b.Type_Id  --子节点数据集.parendID=父节点数据集.ID
)
select * from tab;
 

-- 查找所有子节点
with tab as
(
 select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=1--父节点
 union all
 select b.Type_Id,b.ParentId,b.Type_Name 
 from
  tab a,--父节点数据集
  Sys_ParamType_V2_0 b--子节点数据集 
 where b.ParentId=a.Type_Id  --子节点数据集.ID=父节点数据集.parendID
)
select * from tab;

 

--查找从子节点到定级节点的路径
with tab as
(
 select Type_Id,ParentId,Type_Name,cast(Type_Id as varchar(100)) as fulltypeid
 from SKU_ProductType where Type_Id=423--子节点
 union all
 select
   b.Type_Id,b.ParentId,b.Type_Name,
   cast(a.fulltypeid+‘,‘+cast(b.Type_Id as nvarchar(100)) as varchar(100)) as fulltypeid
 from
  tab a,--子节点数据集
  SKU_ProductType b  --父节点数据集
 where a.ParentId=b.Type_Id  --子节点数据集.parendID=父节点数据集.ID
)
select * from tab ;

--------------结果--------------
423    410   蜂花粉      423
410    347   蜂产品      423,410
347    5      营养食品   423,410,347
5        0      健康保健   423,410,347,5

 

 

摘自:http://write.blog.csdn.net/postedit/7869241

以上是关于200分求助!SQL递归查询所有子节点的主要内容,如果未能解决你的问题,请参考以下文章

数据库语句的递归查询求助

sql根据子节点查出所有的父节点的

sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程

sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程

高手帮忙:sql 里怎样递归判断父节点和子节

T-Sql 递归查询(给定节点查所有父节点所有子节点的方法)