特定の方法で、ツリーの順序付けられた階層を取得する必要があります。問題のテーブルは次のようになります (すべての ID フィールドは一意の識別子です。例のためにデータを単純化しました)。
EstimateItemID EstimateID ParentEstimateItemID ItemType
-------------- ---------- -------------------- ------ --
1 ヌル積
2 A 1 製品
3A2サービス
4 ヌル積
5A4品
6A5サービス
7A1サービス
8A4品
ツリー構造のグラフィカル ビュー (* は「サービス」を示します):
あ
___/ \___
/ \
1 4
/ \ / \
2 7* 5 8
/ /
3* 6*
このクエリを使用して、階層を取得できます ('A' が一意の識別子であると仮定してください。実際にはそうではないことがわかっています)。
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' の子が得られますが、テーブルに表示される順序になります。すなわち:
見積もりアイテムID
--------------
1
2
3
4
5
6
7
8
残念ながら、次の制約に従う結果セットを持つ順序付けられた階層が必要です。
1. 各ブランチをグループ化する必要があります 2. ItemType 'product' および親を持つレコードが最上位ノードです 3. 最上位ノードの後にグループ化された ItemType 'product' および NULL 以外の親を持つレコード 4. ItemType 'service' を持つレコードは、ブランチの最下位ノードです
したがって、この例では、結果が必要な順序は次のとおりです。
見積もりアイテムID
--------------
1
2
3
7
4
5
8
6
これを達成するには、クエリに何を追加する必要がありますか?