Выравнивание родительской дочерней иерархии с несколькими родителями - PullRequest
0 голосов
/ 22 ноября 2018

В моей исходной структуре есть иерархия «родитель-потомок», где ребенок может указывать на своего родителя, а для его родителя может существовать несколько строк.Если мы сгладим иерархию, это будет означать, что каждая дочерняя строка должна существовать под родительской строкой.

Изображение ниже, чтобы уточнить

issue

Я уже выбрал свой ум, как решить эту проблему в T-SQL, поскольку мой исходный набор состоит из 300 тыс. Строк, и это приведет к тяжелой обработке.Помощь очень важна!

Код для непосредственного запуска из приведенного выше примера, см. Ниже.

SELECT *
INTO Orders
FROM (SELECT CAST('A' AS NVARCHAR(1)) AS Id, CAST('' AS NVARCHAR(1)) AS ParentId, CAST(10 AS int) AS Qty UNION ALL
SELECT CAST('A' AS NVARCHAR(1)) AS Id, CAST('' AS NVARCHAR(1)) AS ParentId, CAST(20 AS int) AS Qty UNION ALL
SELECT CAST('B' AS NVARCHAR(1)) AS Id, CAST('A' AS NVARCHAR(1)) AS ParentId, CAST(30 AS int) AS Qty UNION ALL
SELECT CAST('B' AS NVARCHAR(1)) AS Id, CAST('A' AS NVARCHAR(1)) AS ParentId, CAST(40 AS int) AS Qty UNION ALL
SELECT CAST('C' AS NVARCHAR(1)) AS Id, CAST('B' AS NVARCHAR(1)) AS ParentId, CAST(50 AS int) AS Qty UNION ALL
SELECT CAST('C' AS NVARCHAR(1)) AS Id, CAST('B' AS NVARCHAR(1)) AS ParentId, CAST(60 AS int) AS Qty UNION ALL
SELECT CAST('C' AS NVARCHAR(1)) AS Id, CAST('B' AS NVARCHAR(1)) AS ParentId, CAST(70 AS int) AS Qty) AS T1

1 Ответ

0 голосов
/ 22 ноября 2018

Понятия не имею почему вы бы хотели это сделать, но вот как я бы это сделал ...

SELECT
  L1.ID,
  L2.ID,
  L3.ID,
  COALESCE(L3.Qty, L2.Qty, L1.Qty)
FROM
  yourTable   AS L1
OUTER APPLY
(
  SELECT * FROM yourTable WHERE parentID = L1.ID
  UNION ALL
  SELECT NULL, NULL, NULL
)
  AS L2
OUTER APPLY
(
  SELECT * FROM yourTable WHERE parentID = L2.ID
  UNION ALL
  SELECT NULL, NULL, NULL
)
  AS L3
WHERE
  L1.ParentID IS NULL

Высобирается получить LOT строк, хотя.Просто в вашем примере 8 входных строк стали 18 выходными.300 тыс. Входных строк могут легко превратиться в миллионы выходных строк, в зависимости от уровня дублирования данных.

...