200分求助!SQL递归查询所有子节点
id:目录ID,upid:上级目录ID,name:目录名称单表的----------------------------------------idupidname---...
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兄弟能不能稍微对照我的表结构解释下啊,本人较菜,嘿嘿! 展开
----------------------------------------
id upid name
----------------------------------------
1 0 中国
2 1 湖北
3 1 湖南
4 2 武汉
5 2 宜昌
6 3 长沙
7 3 岳阳
......
-----------------------------------------
通过SQL查询出来的结果:
-----------------------------------------
中国 -> 湖北 -> 武汉
中国 -> 湖北 -> 宜昌
中国 -> 湖南 -> 长沙
中国 -> 湖南 -> 岳阳
我要把数据都取出来,放进xml文件生成树形菜单,大家指点下,打得好的话有多少分给多少分
刷新下!兄弟们高效啊,内牛满面中。。。。
2楼的 MuCloudLi兄弟能不能稍微对照我的表结构解释下啊,本人较菜,嘿嘿! 展开
9个回答
展开全部
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
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
展开全部
不知你问的什么意思,还请说详细一点,是查询表还是其他对象的结点。如果是表可以使用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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用自连接!
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-----你的表名。
你试下,肯定是你想要的结果。
层次确定的情况下没必要用递归,效率低!
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-----你的表名。
你试下,肯定是你想要的结果。
层次确定的情况下没必要用递归,效率低!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
三楼,为什么?
楼主,你解题的方向有错!你会所有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文件也不是这么写的!
楼主,你解题的方向有错!你会所有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文件也不是这么写的!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
前提确保没有第四层数据,否则执行肯定不通过
就是只有国-省-市
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
就是只有国-省-市
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询