MSSQL中如何查询用户所有上级?自连接查询失效求助
解决层级用户表的上级递归查询问题
嘿,我一眼就看出你原SQL的问题啦——你写的自连接条件找的是和用户4拥有同一个上级的平级用户,而不是向上追溯的上级节点!咱们来一步步修正这个问题。
先明确你的数据表结构:
| UserID | Name | upline |
|---|---|---|
| 1 | John | 0 |
| 2 | James | 1 |
| 3 | Geena | 2 |
| 4 | Andy | 3 |
你的需求是获取UserID=4的所有上级(也就是John、James、Geena这三位),这种层级递归查询最适合用**递归CTE(公共表表达式)**来实现,因为它能循环向上遍历每一层的上级节点。
正确的SQL查询语句
WITH RecursiveUpline AS ( -- 锚点成员:先定位目标用户(UserID=4)的直接上级 SELECT u.UserID, u.Name, u.upline FROM UserAgent u WHERE u.UserID = (SELECT upline FROM UserAgent WHERE UserID = 4) UNION ALL -- 递归成员:继续向上查找当前节点的上级,直到根节点(upline=0) SELECT parent.UserID, parent.Name, parent.upline FROM UserAgent parent INNER JOIN RecursiveUpline child ON parent.UserID = child.upline WHERE parent.upline != 0 ) -- 最后取出所有上级的UserID和Name SELECT UserID, Name FROM RecursiveUpline;
解释一下这段代码:
- 锚点成员:先找到UserID=4的直接上级(也就是UserID=3的Geena),作为递归的起点。
- 递归成员:每次把当前节点的
upline作为父节点的UserID,向上查询父节点信息,直到父节点的upline=0(也就是根节点John)时停止。 - 执行这个查询后,你就能得到UserID=4的全部3位上级数据:
UserID Name 3 Geena 2 James 1 John
为什么你的原SQL没得到结果?
你原SQL的连接条件是A.upline = u.upline,当u.UserID=4时,u.upline=3,所以这条语句是找所有upline=3的用户——但你的表中只有UserID=4的upline是3,自然没有匹配的结果啦。
内容的提问来源于stack exchange,提问作者abc cba
相关产品推荐
相关产品推荐

