SQLSERVER 求助,递归查询的问题。

Sumour 2017-12-09 01:40:54
有一个这样的需求,就是需要查某个节点下的所有子节点,并按照子节点排在父节点下这种方式输出数据。
这里给出一个例子


请问大神有什么方法可以使用,数据量大概5000W,使用sqlserver2008,并且不能使用存储过程或者函数,只能使用语句

cte递归出来的数据只能按照层分类,不能按照我需求这样的分类。

小弟在次先感激回帖人。
...全文
129 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sumour 2017-12-09
  • 打赏
  • 举报
回复
版主,不知道为什么我这边发帖显示500,我以为没发帖成功,导致重复了@中国风 ,不好意思
ycwww 2017-12-09
  • 打赏
  • 举报
回复
正在找这个问题,谢谢。
中国风 2017-12-09
  • 打赏
  • 举报
回复
利用表变量实现方法,需一个两个栏位,1个记录用于排序,另一个用于层次 e.g.
--DROP TABLE #TData
;WITH TData(father,son)
AS
(
SELECT 'A','B'
UNION ALL SELECT 'A','C'
UNION ALL SELECT 'B','C'
UNION ALL SELECT 'B','D'
UNION ALL SELECT 'A','F'
UNION ALL SELECT 'C','D'
UNION ALL SELECT 'D','F'
UNION ALL SELECT 'E','F'
)
SELECT
*
INTO #TData
FROM TData


--
DECLARE @facher VARCHAR(1)='A',@lev INT=1
DECLARE @TData TABLE(data VARCHAR(1),level INT,Ord VARCHAR(20));
INSERT INTO @TData
        ( data, level,Ord )
SELECT son,@lev,RIGHT(1000+ROW_NUMBER()OVER(ORDER BY @facher),3) FROM #TData WHERE father=@facher
WHILE @@ROWCOUNT>0
BEGIN
	SET @lev+=1
	INSERT INTO @TData
			(  data, level,Ord )
	SELECT  a.son, @lev,b.Ord+RIGHT(1000+ROW_NUMBER()OVER(ORDER BY @facher),3)  FROM #TData AS a INNER JOIN @TData AS b ON b.data=a.father AND b.level=@lev-1 --WHERE NOT EXISTS(SELECT 1 FROM @TData WHERE data=a.son)
END
SELECT * FROM @TData ORDER BY Ord
/*
data	level	Ord
B	1	001
C	2	001001
D	3	001001001
F	4	001001001001
D	2	001002
F	3	001002002
C	1	002
D	2	002003
F	3	002003003
F	1	003
*/
二月十六 2017-12-09
  • 打赏
  • 举报
回复
帖子重复了,在另一个帖子里回复了。
中国风 2017-12-09
  • 打赏
  • 举报
回复
看你这数据,不适用递归,递归父级要唯一才高效

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧