递归加入最近的 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
让我知道这是否适合你。
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
让我知道这是否适合你。