【发布时间】:2021-09-28 20:57:06
【问题描述】:
我有一个具有父子结构的表。
我设法通过使用代理的名字创建一个名为“路径”的字段来对这个结构进行排序,所以这个查询:
WITH cte(PLID, sponsorid, firstname, lastname, Status, LEVEL, path) AS (SELECT
PLID, sponsorid, firstname, lastname, Status, 0 AS LEVEL, CAST(firstname AS VARCHAR(1000)) AS path
FROM TEST WHERE PLID =1 UNION ALL
SELECT c.PLID, c.sponsorid, c.firstname, c.lastname, c.Status, cte. LEVEL + 1 AS LEVEL,
CAST((cte.path + '/' + c.firstname) AS VARCHAR(1000))
AS path FROM TEST c INNER JOIN cte ON c.sponsorid = cte.plid)
SELECT PLID, sponsorid, firstname, lastname, Status, LEVEL, path
FROM cte ORDER BY path ASC
...返回这个,树视图数据:
+------+-----------+-----------+----------+--------+-------+-------------------------------------+
| PLID | SPONSORID | FIRSTNAME | LASTNAME | STATUS | LEVEL | PATH |
+------+-----------+-----------+----------+--------+-------+-------------------------------------+
| 1 | 0 | Danielle | Lipsin | 1 | 0 | Danielle |
| 4 | 1 | Alissa | Doe | 1 | 1 | Danielle/Alissa |
| 2 | 1 | Charles | Doe | 1 | 1 | Danielle/Charles |
| 6 | 2 | Mark | Doe | 1 | 2 | Danielle/Charles/Mark |
| 5 | 2 | Martin | Doe | 1 | 2 | Danielle/Charles/Martin |
| 8 | 5 | Katy | Perry | 1 | 3 | Danielle/Charles/Martin/Katy |
| 7 | 5 | Leo | Messi | 1 | 3 | Danielle/Charles/Martin/Leo |
| 9 | 7 | Alex | Doe | 1 | 4 | Danielle/Charles/Martin/Leo/Alex |
| 10 | 7 | Laureen | Doe | 1 | 4 | Danielle/Charles/Martin/Leo/Laureen |
| 3 | 1 | Michelle | Doe | 1 | 1 | Danielle/Michelle |
+------+-----------+-----------+----------+--------+-------+-------------------------------------+
我尝试进行嵌套选择,但没有成功。在每条记录中包含儿童总数的最佳方法是什么?
预期结果:
+------+-----------+-----------+----------+--------+-------+-------------------------------------+---------------+
| PLID | SPONSORID | FIRSTNAME | LASTNAME | STATUS | LEVEL | PATH | TotalDownline |
+------+-----------+-----------+----------+--------+-------+-------------------------------------+---------------+
| 1 | 0 | Danielle | Lipsin | 1 | 0 | Danielle | 9 |
| 4 | 1 | Alissa | Doe | 1 | 1 | Danielle/Alissa | 0 |
| 2 | 1 | Charles | Doe | 1 | 1 | Danielle/Charles | 7 |
| 6 | 2 | Mark | Doe | 1 | 2 | Danielle/Charles/Mark | 0 |
| 5 | 2 | Martin | Doe | 1 | 2 | Danielle/Charles/Martin | 4 |
| 8 | 5 | Katy | Perry | 1 | 3 | Danielle/Charles/Martin/Katy | 0 |
| 7 | 5 | Leo | Messi | 1 | 3 | Danielle/Charles/Martin/Leo | 2 |
| 9 | 7 | Alex | Doe | 1 | 4 | Danielle/Charles/Martin/Leo/Alex | 0 |
| 10 | 7 | Laureen | Doe | 1 | 4 | Danielle/Charles/Martin/Leo/Laureen | 0 |
| 3 | 1 | Michelle | Doe | 1 | 1 | Danielle/Michelle | 0 |
+------+-----------+-----------+----------+--------+-------+-------------------------------------+---------------+
谢谢。
CREATE TABLE TEST (
PLID int,
sponsorid int,
firstname nvarchar(50),
lastname nvarchar(50),
status int
);
INSERT INTO TEST VALUES (1,0,'Danielle', 'Lipsin', 1);
INSERT INTO TEST VALUES (2,1,'Charles', 'Doe', 1);
INSERT INTO TEST VALUES (3,1,'Michelle', 'Doe', 1);
INSERT INTO TEST VALUES (4,1,'Alissa', 'Doe', 1);
INSERT INTO TEST VALUES (5,2,'Martin', 'Doe', 1);
INSERT INTO TEST VALUES (6,2,'Mark', 'Doe', 1);
INSERT INTO TEST VALUES (7,5,'Leo', 'Messi', 1);
INSERT INTO TEST VALUES (8,5,'Katy', 'Perry', 1);
INSERT INTO TEST VALUES (9,7,'Alex', 'Doe', 1);
INSERT INTO TEST VALUES (10,7,'Laureen', 'Doe', 1);
【问题讨论】:
-
你好戴尔。那你要我删除图片吗?请允许我几分钟,这样我就可以做得很好。谢谢。
-
完成了,戴尔 :) 祝你玩得开心。
-
请提供查询以创建表并插入一些示例数据。另外我们需要预期的结果集根据样本数据。
-
不是真的 Dale,因为在那个例子中,他们正在查询第二个表(销售),我应该在其中对每条记录进行递归查询,以获得同一张表上每个代理的总下线(递归递归表的计数),这就是我努力的地方。换句话说,我不仅需要直接下线的记录计数,还需要下线的下线。我不知道我是否清楚地解释了它。我考虑过为每条记录创建一个循环和一个新查询,但这会使服务器崩溃(超过 25,000 个代理)。
-
我在上面,戴尔。抱歉,在与我的老板打交道时试图让这个 Q 正确。我在上面。
标签: sql sql-server tsql recursive-query