扁平化父级与多个父级的子级结构

时间:2018-11-22 11:38:09

标签: sql sql-server tsql hierarchy hierarchyid

我的源结构中有一个父子层次结构,其中一个孩子可以指向他的父母,而他的父母可以存在多行。如果我们不扁平化层次结构,则意味着每个子行都必须存在于其父行之下。

下面的图片可以澄清

issue

由于我的源集是30万行,因此我已经下定决心如何在T-SQL中以高效的方式解决此问题,这将导致繁重的处理。非常感谢您的帮助!

直接从上面的示例开始的代码,请参见下文。

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 :(得分:1)

我不知道 为什么 ,但是这就是我的做法...

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

尽管如此,您将获得 很多 行。仅在您的示例中,8个输入行就变成18个输出行。 30万个输入行很容易变成数百万个输出行,具体取决于数据的重复级别。