Mam drzewa o strukturze jak ta:Jak prawidłowo oznaczyć gałęzie drzewa w głębi pierwszy wyszukiwania
__2__3__4
/ \__5__6
0__1___7/__8__9
\\
\\__10__11__12
\__ __ __
13 14 15
Node 1 ma czworo dzieci (2,7,10,13), węzłów 2 a 7 ma dwoje dzieci (oba dzielą węzeł 5 jako dziecko). Co próbuję zrobić, to utworzyć CTE, które zapewniają rekordy zawierające węzeł nadrzędny węzeł, w odległości od korzeni i gałęzi (lub widełki) jego zawartego w.
IF (OBJECT_ID('tempdb..#Discovered') IS NOT NULL)
BEGIN
DROP TABLE #Discovered
END
CREATE TABLE #Discovered
(
ID int PRIMARY KEY NOT NULL,
Predecessor int NULL,
OrderDiscovered int
);
INSERT INTO #Discovered (ID, Predecessor, OrderDiscovered)
VALUES (@nodeId, NULL, 0);
--loop through node connections table in a breadth first manner
WHILE @@ROWCOUNT > 0
BEGIN
INSERT INTO #Discovered (ID, Predecessor, OrderDiscovered)
SELECT c.node2_id
,MIN(c.node1_id)
,MIN(d.OrderDiscovered) + 1
FROM #Discovered d JOIN node_connections c ON d.ID = c.node1_id
WHERE c.node2_id NOT IN (SELECT ID FROM #Discovered)
GROUP BY c.node2_id
END;
SELECT * FROM #Discovered;
WITH BacktraceCTE(Id, Predecessor, OrderDiscovered, Path, fork)
AS
(
SELECT d.ID, d.Predecessor, d.OrderDiscovered, CAST(d.ID AS varchar(MAX)), 0
FROM #Discovered d
WHERE d.Id = @itemId
UNION ALL
-- Recursive member, select all the nodes which have the previous
SELECT d.ID, d.Predecessor, d.OrderDiscovered,
CAST(cte.Path + '->' + CAST(d.ID as varchar(10)) as varchar(MAX)),
fork + CONVERT (Integer, ROW_NUMBER() OVER (ORDER BY d.ID)) - 1
FROM #Discovered d JOIN BacktraceCTE cte ON d.Predecessor = cte.ID
)
SELECT Predecessor as node1_id, OrderDiscovered as hop, fork, ID as node2_id, Path FROM BacktraceCTE
ORDER BY fork, OrderDiscovered;
Problem jest z sposób obliczania widelca. Za każdym razem, gdy CTE wraca do poprzedniego poziomu, dostępne są tylko numery wierszy i numer widełek na tym poziomie. To, co chciałbym osiągnąć to nagrania, w których każda kombinacja chmielu i widelca jest wyjątkowa.
Jednak z powyższym kodem dostanę wyniki, które mówią węzeł 2 do 5 skończyć się hop 3 widelec 1 i węzła 7 do 5 również skończyć się hop 3 widelec 1.
Oto drzewo dzięki oznaczeniom gałęzie, jak powinny one pojawić:
__2__3__4 :0
/ \__5__6 :1,2
0__1___7/__8__9 :3
\\
\\__10__11__12 :4
\__ __ __
13 14 15 :5
jak widać dla widelców 1 i 2 myślę, że najlepszym sposobem byłoby liczyć oddziału dwukrotnie nadając jej własny identyfikator w celu zachowania wyjątkowość połączenia chmielu i widelca.
Proszę pomóż mi dowiedzieć się, co muszę zrobić, aby to osiągnąć. Uważam, że powinno to być możliwe za pomocą CTE, ale być może jestem w błędzie, a jeśli tak, chciałbym wiedzieć, jaka byłaby lepsza metoda rozwiązania tego problemu.
EDIT Zestaw wynik wyglądałby następująco:
Poprzednika, ID, Zamówienie Wykryte, ścieżka, widelec
null, 0, 0, 0, 0
0, 1, 1, 0-> 1, 0
1, 2, 2, 0-> 1-> 2, 0
2, 3, 3, 0-> 1> 2> 3 0
3, 4, 4, 0-> 1> 2> 3> 4, 0
2, 5, 3, 0-> 1> 2> 5 1
5, 6, 4, 0-> 1> 2> 5-> 6, 1
1, 7, 2, 0-> 1-> 7 2
7, 5, 3, 0-> 1-> 7> 5, 2
5, 6, 4, 0-> 1-> 7> 5-> 6 2
7, 8, 3, 0-> 1-> 7> 8 3
8, 9 4, 0-> 1-> 7> 8> 9 3
1, 10, 2, 0-> 1> 10 4
10 , 11, 3, 0-> 1-> 10-> 11, 4
11, 12, 4, 0-> 1-> 10-> 11-> 12, 4
1, 13, 2, 0-> 1> 13 5
13, 14, 3, 0-> 1> 13-> 14 5
14, 15, 4, 0-> 1-> 13-> 14-> 15, 5
Od węzła '5' ma dwoje rodziców, to nie drzewa ** **, ale po prostu ** ** – AakashM
wykresu można podać skrypt z twoją strukturą tabeli i przykładowymi danymi i pokazać, jaki jest twój pożądany zestaw wyników dla tych danych? –
@AakashM - Nie tylko wykres, ale skierowany wykres (aka digraf). – HABO