递归加入最近的 Ancestor/Parent 以记录相同 Table?

Recursivly Join Closest Ancestor/Parent To Record In Same Table?

As-per 这个问题的标题我正在尝试在同一 table 中使用特定的 属性(以 parent 为准,使一条记录与另一条记录递归连接记录最接近)但我不完全确定如何处理这个。

我检查了 here and here,但遗憾的是我的要求不够具体 use-case。

SQLFiddle 示例:

http://sqlfiddle.com/#!18/0c5fb/2

我试图实现的最终结果是这样的,其中每一行都知道其最近的祖先,其中 NeededElement 为真:

ElementID ElementName NeededElement ParentElementID ClosestNeededElementID
1 Root Element true (null) (null)
2 Child Element A true 1 1
3 Child Element B false 1 1
4 Child Element AA false 2 2
5 Child Element AB false 2 2
6 Child Element BA false 3 1
7 Child Element BB false 3 1

非常感谢!

您可以使用条件为最近的父级保留 运行 列:

with cte(id, name, n_elem, p, l) as (
   select *, null from testelements where parentelementid is null
   union all
   select t.*, case when c.n_elem = 1 then c.id else c.l end
   from cte c join testelements t on t.parentelementid = c.id
)
select * from cte;

您可以尝试对共享查询进行以下修改。

WITH CTE AS
(
  SELECT
  ElementID,
  ElementName,
  NeededElement,
  ParentElementID,
  ParentElementID as NextParentElementID, 
  CAST(NULL AS INT) as ClosestNeededElementID
  FROM TestElements
  
  UNION ALL
  
  SELECT
      CTE.ElementID,
      CTE.ElementName,
      CTE.NeededElement,
      CTE.ParentElementID,
      TestElements.ParentElementID as NextParentElementID,
      CASE 
          WHEN TestElements.NeededElement=1 THEN TestElements.ElementID
      END AS ClosestNeededElementID
  FROM CTE
  INNER JOIN TestElements ON CTE.NextParentElementID = TestElements.ElementID 
  WHERE CTE.ClosestNeededElementID IS NULL 
)
SELECT 
   ElementID,
  ElementName,
  NeededElement,
  ParentElementID,
  ClosestNeededElementID
FROM CTE
WHERE (ParentElementId IS NULL) OR (ClosestNeededElementId IS NOT NULL)
ORDER BY ElementID ASC

View working demo fiddle

让我知道这是否适合你。