求一个效率最高的SQL语句

baidu_15602717 2014-10-23 04:53:52
表结构如下:

用户名 上级用户ID
userid rid

整个表有3-4级的上下级关系(无法确定)

现在已知某几个userid,求SQL语句扫出所有已知userid的下级(包括下级的下级 和 下级的下级的下级)
...全文
115 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_15602717 2014-10-23
  • 打赏
  • 举报
回复
看来只能这样了,谢谢大家帮助 结贴
还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
;WITH TBCTE AS(
    SELECT A.userid,A.rid,B.userid RU FROM TABLENAME A LEFT JOIN TABLENAME B ON A.rid=B.userid
)
,CTE AS(
    SELECT *,CAST(userid AS VARCHAR(8000))[PATH] FROM TBCTE WHERE RU IS NULL
    UNION ALL
    SELECT A.*,B.[PATH]+'-'+CAST(A.userid AS VARCHAR(8000)) FROM TBCTE A JOIN CTE B ON A.rid=B.userid
)
SELECT A.* FROM CTE A LEFT JOIN CTE B ON A.[PATH]LIKE B.[PATH]+'-%'WHERE B.userid IN(1,2,3)
上面小调如下 TABLENAME换成你的表名
还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
;WITHTBCTE AS(
	SELECT A.userid,A.rid,B.userid RU FROM TABLENAME A LEFT JOIN TABLENAME B ON A.rid=B.userid
)
,CTE AS(
	SELECT *,CAST(userid AS VARCHAR(8000))[PATH] FROM TBCTE WHERE RU IS NULL
	UNION ALL
	SELECT A.*,B.[PATH]+'-'+CAST(A.userid AS VARCHAR(8000)) FROM TBCTE A JOIN CTE B ON A.rid=B.userid
)
SELECT A.* FROM CTE A LEFT JOIN CTE B ON A.[PATH]LIKE B.[PATH]+'-%'WHERE B.userid IN(1,2,3)
你可以参考一下,把最后面的 1 2 3换成你的userid,会查出这些的子级,不包括本身
Tiger_Zhao 2014-10-23
  • 打赏
  • 举报
回复
递归虽然理论上效率不算很高,不过只有3-4级还是非常快的
WITH tree AS (
SELECT userid, rid FROM userTable WHERE rid IN (1,3,5,7) --已知某几个userid
UNION ALL
SELECT u.userid, u.rid
FROM tree t
JOIN userTable u
ON u.rid = t.userid
)
SELECT * FROM tree
--小F-- 2014-10-23
  • 打赏
  • 举报
回复
用 CTE递归吧。去百度一下 N多的例子。
卖水果的net 2014-10-23
  • 打赏
  • 举报
回复

-- 大概语法是这样,你自己改一下吧,这是查 ID = 100 的所有下级。
with mt as 
(
select * from mytable where id = 100
union all
select * from mytable x , mt where mt.id = x.rid
)
select * from mt 

还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
这个表结构,不用递归之类的东西,不好处理 递归的话,3-4级速度还行,多的也不行

22,209

社区成员

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

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