3

このようにクエリをツリーとして注文するのに問題があります

WITH UtHierarchy
AS (
    SELECT etabid
        ,ut
        ,utlib
        ,parenteut
        ,0 AS LEVEL
        ,ut AS root
    FROM RUT
    WHERE etabid = 1
        AND parenteut IS NULL

    UNION ALL

    SELECT RUT.etabid
        ,RUT.ut
        ,RUT.utlib
        ,RUT.parenteut
        ,LEVEL + 1 AS LEVEL
        ,RUT.parenteut AS root
    FROM RUT
    INNER JOIN UtHierarchy uh ON uh.ut = rut.parenteut
    WHERE RUT.ETABID = 1
    )
SELECT *
FROM UtHierarchy
ORDER BY root

次のツリーが必要です:

UTルート
UTルート
-UTレベル1
UTルート
-UTレベル1
---UTレベル2
UTルート

これはレベル0または1で意図したとおりに機能していますが、より高いレベルでは壊れています。ルート列で「レベル0」の親を選択してルートとutで並べ替えようとしましたが、この問題についてしばらくすると、できません:(

これを解決する方法は?

ご協力いただきありがとうございます。

編集:SQLカラーで編集していただきありがとうございます:)最上位レベルの解決策を見てきましたが、ユーザーは自分の投稿を削除しました。

WITH UtHierarchy 
AS (
  SELECT etabid
  ,ut
  ,utlib
  ,parenteut,
  0 as profondeur,
  ut as root
  FROM RUT 
  where etabid = 278
  and parenteut is null
  UNION  ALL
  SELECT RUT.etabid
  , RUT.ut
  , RUT.utlib
  , RUT.parenteut
  , profondeur + 1 as profondeur
  , root as root 
  FROM RUT 
  inner join UtHierarchy uh on uh.ut = rut.parenteut
  where RUT.ETABID = 278
)
select ut, parenteut, profondeur, root 
from UtHierarchy
order by root

しかし、それも機能していません

これが真のデータの例です

ut parenteutlevel root
10 1 1 1
11 1 1 1
12 1 1 1
13 1 1 1
14 1 1 1
130 13 2 1
131 13 2 1
132 13 2 1
133 13 2 1
134 13 2 1
135 13 2 1
136 13 2 1
120 12 2 1
121 12 2 1
122 12 2 1
110 11 2 1
111 11 2 1
112 11 2 1
113 11 2 1
114 11 2 1
115 11 2 1
116 11 2 1
101 10 2 1
102 10 2 1
103 10 2 1
104 10 2 1
105 10 2 1
106 10 2 1
107 10 2 1
1 0 1

ご覧のとおり、これは適切な構造ではありません。私はこのように木が必要です:

ut parenteutlevel root
1 0 1
10 1 1 1
101 10 2 1
102 10 2 1
103 10 2 1
104 10 2 1
105 10 2 1
106 10 2 1
107 10 2 1
11 1 1 1
110 11 2 1
111 11 2 1
112 11 2 1
113 11 2 1
114 11 2 1
115 11 2 1
116 11 2 1
12 1 1 1
120 12 2 1
121 12 2 1
122 12 2 1
13 1 1 1
130 13 2 1
131 13 2 1
132 13 2 1
133 13 2 1
134 13 2 1
135 13 2 1
136 13 2 1
14 1 1 1    
4

1 に答える 1

9

再帰呼び出しが正しいので、問題は結果のソートにあります

ORDER BY ルート

並べ替えパスを作成して、正しい順序で並べ替えることができます。

WITH UtHierarchy
AS (
    SELECT etabid
        ,ut
        ,utlib
        ,parenteut
        ,0 AS LEVEL
        ,ut AS root
        ,RIGHT('000000' + CAST(ut AS varchar(MAX)), 6) AS sort
    FROM RUT
    WHERE etabid = 1
        AND parenteut IS NULL

    UNION ALL

    SELECT RUT.etabid
        ,RUT.ut
        ,RUT.utlib
        ,RUT.parenteut
        ,LEVEL + 1 AS LEVEL
        ,RUT.parenteut AS root
        ,uh.sort+'/'+RIGHT('000000' + CAST(RUT.ut AS varchar(20)), 6) AS sort
    FROM RUT
    INNER JOIN UtHierarchy uh ON uh.ut = rut.parenteut
    WHERE RUT.ETABID = 1
    )
SELECT *
FROM UtHierarchy
ORDER BY sort

編集:

CASE => CAST (スペルミス)

編集 2 (テスト データから実際の例を追加する):

ここに、コピー アンド ペーストのテスト コードがあります。私にとってはうまくいきます:

SELECT 10 AS ut, 1 AS parenteut
INTO #RUT
UNION ALL SELECT 11, 1
UNION ALL SELECT 12, 1
UNION ALL SELECT 13, 1
UNION ALL SELECT 14, 1
UNION ALL SELECT 130, 13
UNION ALL SELECT 131, 13
UNION ALL SELECT 132, 13
UNION ALL SELECT 133, 13
UNION ALL SELECT 134, 13
UNION ALL SELECT 135, 13
UNION ALL SELECT 136, 13
UNION ALL SELECT 120, 12
UNION ALL SELECT 121, 12
UNION ALL SELECT 122, 12
UNION ALL SELECT 110, 11
UNION ALL SELECT 111, 11
UNION ALL SELECT 112, 11
UNION ALL SELECT 113, 11
UNION ALL SELECT 114, 11
UNION ALL SELECT 115, 11
UNION ALL SELECT 116, 11
UNION ALL SELECT 101, 10
UNION ALL SELECT 102, 10
UNION ALL SELECT 103, 10
UNION ALL SELECT 104, 10
UNION ALL SELECT 105, 10
UNION ALL SELECT 106, 10
UNION ALL SELECT 107, 10
UNION ALL SELECT 1, 0;

WITH UtHierarchy
AS (
    SELECT
        ut
        ,parenteut
        ,0 AS LEVEL
        ,ut AS root
        ,RIGHT('000000' + CAST(ut AS varchar(MAX)), 6) AS sort
    FROM #RUT
    WHERE
        parenteut = 0

    UNION ALL

    SELECT 
        RUT.ut
        ,RUT.parenteut
        ,LEVEL + 1 AS LEVEL
        ,RUT.parenteut AS root
    ,uh.sort+'/'+RIGHT('000000' + CAST(RUT.ut AS varchar(20)), 6) AS sort
    FROM #RUT AS RUT
    INNER JOIN UtHierarchy uh ON uh.ut = rut.parenteut    
    )
SELECT *
FROM UtHierarchy
ORDER BY sort

DROP TABLE #RUT;
于 2012-04-04T15:00:14.580 に答える