具有多个孩子的递归CTE

问题描述 投票:1回答:1

我有一个cte即时工作的问题。

首先,我创建了一个显示我遇到的问题的示例:

CREATE TABLE #ctetemp (ID int, ParentID int, Level int, Value float, Unit varchar(5), Name Varchar(150))

INSERT INTO #ctetemp (ID, ParentID, Level, Value, Unit, Name)
VALUES 
(50,21,4,7.15,'C','Name01'),
(306,106,6,7.15,'A','Name02'),
(307,106,6,2.86,'A','Name03'),
(308,106,6,7.15,'A','Name04'),
(309,106,6,14.3,'A','Name05'),
(310,106,6,2.86,'A','Name06'),
(311,106,6,2.86,'A','Name08'),
(312,107,6,14.3,'A','Name07'),
(313,107,6,28.6,'A','Name09'),
(314,107,6,28.6,'A','Name10'),
(315,107,6,34.32,'A','Name11'),
(338,112,6,28.6,'B','Name12'),
(339,112,6,14.3,'B','Name13'),
(340,112,6,14.3,'B','Name14'),
(341,112,6,14.3,'B','Name15'),
(342,113,6,71.5,'B','Name16'),
(372,118,6,14.3,'C','Name17'),
(373,118,6,14.3,'C','Name18'),
(375,118,6,14.3,'C','Name19'),
(375,118,6,42.9,'B','Name19'),
(414,122,6,14.3,'B','Name20'),
(415,122,6,14.3,'B','Name21'),
(416,122,6,14.3,'B','Name22'),
(417,122,6,14.3,'B','Name23'),
(418,122,6,14.3,'B','Name24'),
(419,122,6,14.3,'B','Name25'),
(500,131,6,7.15,'C','Name26'),
(938,193,6,7.15,'C','Name27'),
(1188,228,6,14.3,'C','Name28'),
(1285,244,6,14.3,'B','Name29'),
(1324,253,6,0,'C','Name30'),
(1327,253,6,42.9,'C','Name31'),
(1482,282,6,14.3,'C','Name32'),
(1548,1547,5,28.6,'A','Name33'),
(1561,1548,6,14.3,'A','Name34'),
(1601,106,6,28.6,'C','Name64'),
(1602,106,6,28.6,'C','Name35'),
(1603,106,6,28.6,'C','Name36'),
(1604,106,6,14.3,'C','Name37'),
(1689,118,6,14.3,'C','Name38'),
(1690,118,6,7.15,'C','Name62'),
(1819,131,6,7.15,'C','Name39'),
(1820,131,6,7.15,'C','Name40'),
(2281,193,6,7.15,'C','Name27'),
(2303,196,6,21.45,'A','Name41'),
(2304,196,6,28.6,'A','Name42'),
(2518,228,6,7.15,'C','Name63'),
(2539,231,6,7.15,'A','Name43'),
(3642,1548,6,42.9,'A','Name44'),
(21,10,3,0,NULL,'Name45'),
(106,36,5,0,NULL,'Name46'),
(107,37,5,0,NULL,'Name47'),
(112,40,5,0,NULL,'Name48'),
(113,41,5,0,NULL,'Name49'),
(118,44,5,0,NULL,'Name50'),
(122,46,5,0,NULL,'Name51'),
(131,50,5,0,NULL,'Name52'),
(228,80,5,0,NULL,'Name53'),
(253,93,5,0,NULL,'Name54'),
(282,102,5,0,NULL,'Name55'),
(40,17,4,0,NULL,'Name56'),
(41,17,4,0,NULL,'Name57'),
(44,19,4,0,NULL,'Name58'),
(46,19,4,0,NULL,'Name61'),
(17,8,3,0,NULL,'Name59'),
(19,9,3,0,NULL,'Name60')

;WITH CTE AS
(
   -- define the "anchor" query - select the chosen forum
   SELECT 
      f.id, f.Value, f.id as RootID, f.Unit, f.Level
   FROM #ctetemp f
   WHERE Level = 3
   UNION ALL
   -- select the child rows
   SELECT 
    f.id, f.value, cte.RootID, f.Unit, f.Level
    FROM #ctetemp f
    INNER JOIN CTE on f.ParentID = CTE.ID
)

SELECT * FROM CTE 
WHERE Unit IS NOT NULL
ORDER BY ID

DROP TAble #ctetemp

你可以得到一个表,每个ID可以包含多个条目。它是多个用户的答案列表。我想将这些答案分组,然后按级别和单位逐步汇总它们的值。每个单元可以有多个用户,每个用户都可以回答所有问题,如果这是有道理的:)。每个单元都有一个未定义的单位数和一个未完成的用户数。

在当前脚本中,单元A的所有答案都会丢失。我想我需要在CTE中使用LEFT JOIN,但我不能(因为它在递归部分是禁止的)。

任何帮助,将不胜感激

亲切的问候卢卡斯

sql tsql recursion common-table-expression
1个回答
0
投票

我不知道你是否简化了示例数据,但查询是否正确不包括单位A

根据示例数据,所有这些节点都没有连接到任何东西。他们只是晃来晃去的分支。

例如:

  • 'A':306 - > 106 - > 36(不存在)。
  • 'A':3642 - > 1548 - > 1547(不存在)。
  • 'A':2304 - > 196(不存在)。

没有办法从树的其余部分到达任何节点'A'。

© www.soinside.com 2019 - 2024. All rights reserved.