Рекурсивный CTE с несколькими детьми - PullRequest
0 голосов
/ 12 сентября 2018

У меня проблема с компьютером, над которым я работаю.

Прежде всего я создал пример, показывающий возникшую у меня проблему:

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

Как вы можете видеть, яу нас есть таблица, которая может содержать более 1 записи на ID.Это список ответов нескольких пользователей.Я хочу сгруппировать эти ответы и суммировать их значения в дальнейшем по уровням и единицам.Может быть несколько пользователей на единицу, и каждый пользователь может ответить на все вопросы, если это имеет смысл :).Существует неопределенное количество единиц и неопределенное количество пользователей для каждой единицы.

В текущем сценарии все ответы от единицы A теряются.Я думаю, что мне нужно LEFT JOIN в CTE, но я не могу (так как это запрещено в рекурсивной части).

Буду признателен за любую помощь

С уважением, Лукас

1 Ответ

0 голосов
/ 12 сентября 2018

Не знаю, слишком ли вы упростили данные примера, но запрос прав, если не включить единицу измерения A.

Согласно данным примера все эти узлы не связаны ни с чем.Это просто свисающие ветви.

Например:

  • 'A': 306 -> 106 -> 36 (не существует).
  • 'A ': 3642 -> 1548 -> 1547 (что не существует).
  • ' A ': 2304 -> 196 (что не существует).

Естьнет способа добраться до какого-либо узла 'A' из остальной части дерева.

...