Muszę uporządkowanej hierarchii drzewa, w specyficzny sposób. W tabeli w pytaniu wygląda trochę tak (wszystkie pola ID są uniqueidentifiers, mam uproszczone dane dla dobra przykład):CTE Recursion dostać drzewo hierarchii
EstimateItemID EstimateID ParentEstimateItemID ItemType -------------- ---------- -------------------- -------- 1 A NULL product 2 A 1 product 3 A 2 service 4 A NULL product 5 A 4 product 6 A 5 service 7 A 1 service 8 A 4 product
graficzny widok struktury drzewa (* „usługa” oznacza):
A ___/ \___ / \ 1 4 /\ /\ 2 7* 5 8 / / 3* 6*
Korzystanie z tej kwerendy, mogę hierarchię (udawać „A” jest uniqueidentifier, wiem, że nie jest w prawdziwym życiu):
DECLARE @EstimateID uniqueidentifier
SELECT @EstimateID = 'A'
;WITH temp as(
SELECT * FROM EstimateItem
WHERE EstimateID = @EstimateID
UNION ALL
SELECT ei.* FROM EstimateItem ei
INNER JOIN temp x ON ei.ParentEstimateItemID = x.EstimateItemID
)
SELECT * FROM temp
to daje mi dzieci EstimateID "A", ale w kolejność, w jakiej pojawia się w tabeli. tj:
EstimateItemID -------------- 1 2 3 4 5 6 7 8
Niestety, co potrzebne jest uporządkowana hierarchia ze zbioru wynikowego, że stosuje następujące ograniczenia:
1. each branch must be grouped 2. records with ItemType 'product' and parent are the top node 3. records with ItemType 'product' and non-NULL parent grouped after top node 4. records with ItemType 'service' are bottom node of a branch
Tak, kolejność, że muszę wyniki, w tym przykładzie, :
EstimateItemID -------------- 1 2 3 7 4 5 8 6
Co muszę dodać do mojego zapytania, aby to osiągnąć?
Genialny. Jest to kilka lat, ale dziś okazało się przydatne. Jednak, wybaczając to, stwierdziłem, że przykład podany w oryginalnym poście jest dla mnie trudny do przetłumaczenia na bardziej powszechne rozwiązanie. Przekazałem więc Twój (świetny) pomysł, wykorzystując bardziej popularne dane, nazwę tabeli i pola, aby ułatwić innym śledzenie. – ptownbro
Czy istnieje sposób na uporządkowanie według ItemType z poziomem 0 i hierarchia powinna pozostać taka, jaka jest? –