4

メイン リーフとサブ リーフを検索する CTE クエリがあります。しかし、2人の兄弟の間で葉の選択順序を制御するのに問題があります:

テーブルの各行は次のように宣言されます。

(childID INT ,parentID INT ,NAME NVARCHAR(30),location int)

location彼らが兄弟であるIFFをソートする優先順位はどこですか。

そして、私はこのツリー構造を持っています: これらのペアには場所の優先順位があります:

ここに画像の説明を入力

例えば ​​:

`a` ( location=1) should be before `f` (location=2)
`b` ( location=1) should be before `e` (location=2)
`d` ( location=1) should be **before** `c` (location=2)

問題は、正しい構造 ( sibling unsorted ) を確認するために最初 にやらなければならないように思われることです。order by childID

しかし、正しい構造 ( && sibling sortedorder by )を確認できるようにするには、どのように表示する必要がありますか?

(私の例では:d前に来る必要がありますc

これは、すべてのツリー リーフ (ソートされていない兄弟) を生成する作業クエリです。

pschildIDは、並べ替えについて何も示していません。それは単なるプレースホルダーです。私が言ったように、2人の兄弟の間の位置はlocation列です.(ここでは、行を挿入した順序であるため、childIdはソートされています...

4

2 に答える 2

3

以下は、Royi Namir の要求により、パスに左パディングされた数値文字列を使用するように変更された i-one の回答です。

;WITH CTE AS(
   SELECT childID, parentID, 0 AS depth, NAME , location,
         Cast( Right( '00000' + Cast( Location as VarChar(6) ), 6 ) as  VarChar(1024) ) as Path
   FROM   @myTable
   WHERE   childID = parentID 
    UNION ALL
    SELECT  TBL.childID, TBL.parentID,
           CTE.depth + 1 , TBL.name ,TBL.location,
           Cast( cte.Path + '.' + Right( '00000' + Cast( Tbl.Location as VarChar(6) ), 6 ) as VarChar(1024) )
    FROM   @myTable AS TBL
            INNER JOIN CTE  ON  TBL.parentID = CTE.childID
    WHERE   TBL.childID<>TBL.parentID
)
SELECT depth, childID, parentID, location, REPLICATE('----', depth) + name
FROM CTE
ORDER BY path

注意: 未テストで、休暇中に書かれています。

区切り文字 ( .) は必須ではありませんが、結果の値が読みやすくなり、共通のサブパスの検索など、一部の操作が簡素化される場合があります。

于 2013-08-04T11:52:28.260 に答える