【问题标题】:Recursive CTE with multiple children具有多个孩子的递归 CTE
【发布时间】:2019-02-17 07:56:35
【问题描述】:

我正在处理的 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,但我不能(因为它在递归部分是被禁止的)。

任何帮助将不胜感激

亲切的问候 卢卡斯

【问题讨论】:

  • 我不太了解您的示例数据。最后一行 19 有一个 parent_id 9... 我没有看到。
  • 另外,由于您要执行 JOIN,我假设 PARENT_IDID 之间有一个外键。但我不明白如何明确添加它。请问可以加吗?我认为首先获得一个干净的模型很重要。

标签: sql tsql recursion common-table-expression


【解决方案1】:

我不知道您是否过度简化了示例数据,但查询不包括单元A 是正确的。

根据示例数据,所有这些节点都没有连接到任何东西。它们只是悬垂的树枝。

例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    相关资源
    最近更新 更多