Sql 计数嵌套树用户数
我想计算用户1下有多少成员。 为此,我创建了一个只计算左侧的函数 所以它像1->2->3。所以它是2。 在计算右侧时也做了同样的事情Sql 计数嵌套树用户数,sql,sql-server-2005,recursion,Sql,Sql Server 2005,Recursion,我想计算用户1下有多少成员。 为此,我创建了一个只计算左侧的函数 所以它像1->2->3。所以它是2。 在计算右侧时也做了同样的事情 因此,如果没有更具体的问题定义,如何计算“所有边”的意思是“左”和“右”,就很难提供很好的帮助。然而,如果你能数一数左边的条目,听起来你已经完成了一半 不要计算左手边的条目,而是尝试计算两边的条目。此的Psuedo代码如下所示: id left_User_ID right_User_ID referral_Id -- ------------ -----
因此,如果没有更具体的问题定义,如何计算“所有边”的意思是“左”和“右”,就很难提供很好的帮助。然而,如果你能数一数左边的条目,听起来你已经完成了一半 不要计算左手边的条目,而是尝试计算两边的条目。此的Psuedo代码如下所示:
id left_User_ID right_User_ID referral_Id
-- ------------ ------------- -----------
1 2 5 1
2 3 4 1
3 null null 2
如果您使用的任何后端语言都有一个树结构库,我希望已经提供了类似的函数
编辑:
在揭示了我们确实有一个树表结构,可以在SQL中查询之后-
表:
public static int leafCount(Node node) {
if (node == null) {
return 0;
}
return 1 + leafCount(node.left) + leafCount(node.right);
}
数据:
CREATE TABLE RECURSE (ID INT NOT NULL WITH DEFAULT,
R_SIDE INT NOT NULL WITH DEFAULT,
L_SIDE INT NOT NULL WITH DEFAULT)
结果设置:
INSERT INTO RECURSE VALUES (1, 2, 5)
(2, 3, 4)
(3, 0, 0)
(4, 0, 0)
(5, 0, 0)
此语句将返回左侧和右侧节点的计数。至少在DB2下,似乎存在一些限制,使得在递归CTE中很难使用左连接,因此必须分别计算左连接和右连接。如果它不能完全满足您的需求,请以此为起点
Id R_Side L_Side
1 2 5
2 3 4
3 0 0
4 0 0
5 0 0
收益率:
WITH left_side (id, count) as (SELECT id, 0
FROM recurse
WHERE L_Side = 0
UNION ALL
SELECT a.id, 1 + b.count
FROM recurse as a
JOIN left_side as b
ON b.id = a.l_side
where a.l_side > 0),
right_side (id, count) as (SELECT id, 0
FROM recurse
WHERE R_Side = 0
UNION ALL
SELECT a.id, 1 + b.count
FROM recurse as a
JOIN right_side as b
ON b.id = a.R_Side
where a.l_side > 0)
SELECT a.id, COALESCE(b.count, 0) + COALESCE(c.count, 0) as LeafCount
FROM recurse as a
LEFT JOIN right_side as b
ON b.id = a.id
LEFT JOIN left_side as c
ON clid = a.id
如果对问题没有更具体的定义,就很难提供好的帮助。然而,如果你能数一数左边的条目,听起来你已经完成了一半 不要计算左手边的条目,而是尝试计算两边的条目。此的Psuedo代码如下所示:
id left_User_ID right_User_ID referral_Id
-- ------------ ------------- -----------
1 2 5 1
2 3 4 1
3 null null 2
如果您使用的任何后端语言都有一个树结构库,我希望已经提供了类似的函数
编辑:
在揭示了我们确实有一个树表结构,可以在SQL中查询之后-
表:
public static int leafCount(Node node) {
if (node == null) {
return 0;
}
return 1 + leafCount(node.left) + leafCount(node.right);
}
数据:
CREATE TABLE RECURSE (ID INT NOT NULL WITH DEFAULT,
R_SIDE INT NOT NULL WITH DEFAULT,
L_SIDE INT NOT NULL WITH DEFAULT)
结果设置:
INSERT INTO RECURSE VALUES (1, 2, 5)
(2, 3, 4)
(3, 0, 0)
(4, 0, 0)
(5, 0, 0)
此语句将返回左侧和右侧节点的计数。至少在DB2下,似乎存在一些限制,使得在递归CTE中很难使用左连接,因此必须分别计算左连接和右连接。如果它不能完全满足您的需求,请以此为起点
Id R_Side L_Side
1 2 5
2 3 4
3 0 0
4 0 0
5 0 0
收益率:
WITH left_side (id, count) as (SELECT id, 0
FROM recurse
WHERE L_Side = 0
UNION ALL
SELECT a.id, 1 + b.count
FROM recurse as a
JOIN left_side as b
ON b.id = a.l_side
where a.l_side > 0),
right_side (id, count) as (SELECT id, 0
FROM recurse
WHERE R_Side = 0
UNION ALL
SELECT a.id, 1 + b.count
FROM recurse as a
JOIN right_side as b
ON b.id = a.R_Side
where a.l_side > 0)
SELECT a.id, COALESCE(b.count, 0) + COALESCE(c.count, 0) as LeafCount
FROM recurse as a
LEFT JOIN right_side as b
ON b.id = a.id
LEFT JOIN left_side as c
ON clid = a.id
这是递归…只有在sql中使用cte才能实现递归。我使用了MSSQLServer2005。我试着用这个来计算左侧节点 这里我的桌子名是LEG 左创建函数_legs@idint 返回varchar4作为开始 声明@count int set@count=0而@id=0 开始 set@id=castSELECT left_user_Id from Leg,其中Id=@idas varchar4 如果@id!=0 开始 设置@count=@count+'1' 终止 终止 返回@count 终止 此函数仅在一个方向上计算左节点总数。
这是递归…只有在sql中使用cte才能实现递归。我使用了MSSQLServer2005。我试着用这个来计算左侧节点 这里我的桌子名是LEG 左创建函数_legs@idint 返回varchar4作为开始 声明@count int set@count=0而@id=0 开始 set@id=castSELECT left_user_Id from Leg,其中Id=@idas varchar4 如果@id!=0 开始 设置@count=@count+'1' 终止 终止 返回@count 终止 此函数仅在一个方向上计算左节点总数。
... 您已经用SQL标记了它,但我没有看到任何特定于SQL的内容,甚至没有看到任何指示正在使用数据库的内容……调用函数以向左计数并存储答案。调用函数以正确计数并存储答案。把这两个答案加起来。。。。您已经用SQL标记了它,但我没有看到任何特定于SQL的内容,甚至没有看到任何指示正在使用数据库的内容……调用函数以向左计数并存储答案。调用函数以正确计数并存储答案。将这两个答案相加。但我想得到节点1下的节点总数。这是4。仍然不知道如何通过SQL2005中的CTE实现,但我想获得节点1下的节点总数。这是4。仍然不知道如何通过SQL2005中的CTE实现上述概念,以及如何在MS sql 2005中实现上述概念。这是递归..但不知道如何使用CTE实现。如何在MS sql 2005中实现上述概念。这是递归,但不知道如何用CTE实现。