У меня есть таблица, в которой хранится бинарное дерево следующим образом:Получить влево или вправо на основе на ancenstor для бинарного дерева
Id ParentId Level Placement
47 -1 0 0
23 47 1 0
86 47 1 1
5 23 2 0
29 23 2 1
68 86 2 0
8 5 3 1
31 29 3 1
67 68 3 0
.
.
.
Использование MSSQL мне нужно SQL, что данный ParentID и childId, он говорит в refrence к parentId, будь то слева или справа. Например
FindPoistion (ParentId: 47, childId: 34) возвращается влево
FindPoistion (ParentId: 23, childId: 8) возвращается влево
FindPoistion (ParentId: 29, childId: 30) возвращается право
FindPoistion (ParentId: 47, childId: 5) возвращается влево
FindPoistion (ParentId: 47, childId: 62) возвращает право FindPoistion (ParentId: 47, childId: 86) возвращает право
Как написать sql, который дает мне позицию на основе ancenstor?
Над размещением 0 слева и 1 является правильным
это то, что я до сих пор
WITH name_tree
AS (SELECT Id,
Parentid,
Placement
FROM BinaryTree
WHERE Parentid = 47 and Id= 31
-- this is the starting point you want in your recursion
UNION ALL
SELECT c.Id,
c.Parentid,
c.Placement
FROM BinaryTree c
JOIN name_tree p
ON p.Id = c.ParentId -- this is the recursion
AND c.Id <> c.Parentid
)
SELECT distinct Id, parentId, Placement
FROM name_tree
Кажется довольно легко. Вы должны попробовать что-то и показать нам, что вы пробовали. – manderson
Это похоже на довольно типичный рекурсивный cte. Я бы предположил, что вы используете NULL в качестве ParentID, когда нет ни одного, а не -1. Не только с логической точки зрения, но и с вашим кодом будет немного легче работать. –
Может быть, я в замешательстве ... Если у его стола есть ParentID и Id (Предполагая, что это Child) ... и есть Placement для показа слева или справа ... Почему даже использовать CTE? Это будет просто прямой оператор select с parentid/id в качестве параметров, так как он сказал, что ему нужно только знать, находится ли он слева или справа. Поправьте меня, если я ошибаюсь в своих мыслях. – manderson