特定の方法で、ツリーの順序付けられた階層を取得する必要があります。問題のテーブルは次のようになります (すべての 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
これを達成するには、クエリに何を追加する必要がありますか?