Этот запрос ...
SELECT DISTINCT T2.*
FROM
(
SELECT lineage
FROM dfTree
WHERE id IN (4, 5)
) T1
JOIN dfTree T2
ON
T1.Lineage LIKE T2.Lineage + '%'
... возвращает следующий результат для ваших тестовых данных:
Id ParentId Name Depth Lineage
1 NULL Root Node 0 /1/
2 1 Child A 1 /1/2/
4 1 Child C 1 /1/4/
5 2 Child D 2 /1/2/5/
Как видите, все пути "объединены" вместе- например, компонент пути Id=1
принадлежит как пути: /1/4/
, так и пути: /1/2/5/
, но существует в наборе результатов только один раз.
С другой стороны,если вам нужно нужно различать разные пути, вам нужно сделать что-то вроде этого:
SELECT T2.*, T1.Id LeafId
FROM
(
SELECT id, lineage
FROM dfTree
WHERE id IN (4, 5)
) T1
JOIN dfTree T2
ON
T1.Lineage LIKE T2.Lineage + '%'
Результат:
Id ParentId Name Depth Lineage LeafId
1 NULL Root Node 0 /1/ 4
4 1 Child C 1 /1/4/ 4
1 NULL Root Node 0 /1/ 5
2 1 Child A 1 /1/2/ 5
5 2 Child D 2 /1/2/5/ 5
В этом случаекаждый путь идентифицирован своим листом.Это предполагает, что нет никаких ромбовидных зависимостей (т.е. это настоящее дерево, а не просто DAG );если равны , вам нужно будет использовать T1.Lineage
вместо T1.Id
для определения пути.