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

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


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

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

小弟在次先感激回帖人。
...全文
91 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
看你这数据,不适用递归,递归父级要唯一才高效
  • 打赏
  • 举报
回复
相关推荐
发帖
疑难问题
加入

2.1w+

社区成员

MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
申请成为版主
帖子事件
创建了帖子
2017-12-09 01:40
社区公告
暂无公告