在没有游标的情况下在SQL中展平SQL分层数据结构

Mat*_*att 2 sql sql-server hierarchical-data sql-server-2008

假设我有下表

SectionID ParentIDSection DatumID
   1           NULL         1
   2            1           2
   3            1           3
   4            2           4
Run Code Online (Sandbox Code Playgroud)

现在,让我假装我想选择SectionID = 1下的所有DatumID,即使它是它的后代孩子的一部分,所以我会得到

SectionID DatumID
  1         1
  1         2
  1         3
  1         4
Run Code Online (Sandbox Code Playgroud)

是否有可能在没有用游标递归地迭代第一个表的情况下?

d89*_*761 5

这让我困惑了一分钟,因为它与我对递归的看法有相反的方向,但我想出了这个非常简单的解决方案:

;WITH Rollups AS (
    SELECT SectionId, ParentIdSection, DatumId
    FROM SectionDataTable
    UNION ALL
    SELECT parent.SectionId, parent.ParentIdSection, child.DatumId
    FROM SectionDataTable parent 
    INNER JOIN Rollups child ON child.ParentIdSection = parent.SectionId
)
SELECT *
FROM Rollups 
WHERE SectionID = 1
Run Code Online (Sandbox Code Playgroud)

(替换为您想要的部分ID)