Мне нужно получить упорядоченную иерархию дерева определенным образом. Соответствующая таблица выглядит примерно так (все поля ID являются уникальными идентификаторами, я упростил данные для примера):
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
Графический вид древовидной структуры (* обозначает "сервис" ):
A
___/ \___
/ \
1 4
/ \ / \
2 7* 5 8
/ /
3* 6*
Используя этот запрос, я могу получить иерархию (просто притворись, что "А" является уникальным идентификатором, я знаю, что это не в реальной жизни):
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
Это дает мне детей EstimateID 'A', но в том порядке, в котором он отображается в таблице. то есть:
EstimateItemID
--------------
1
2
3
4
5
6
7
8
К сожалению, мне нужна упорядоченная иерархия с набором результатов, который следует за следующими ограничениями:
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
Итак, порядок, в котором мне нужны результаты, в этом примере:
EstimateItemID
--------------
1
2
3
7
4
5
8
6
Что мне нужно добавить к моему запросу для выполнения этого?