0

「シナリオ」の値が増えると、同じパターンを何度も繰り返して再帰的なCTEを繰り返し実行しようとしています。 RowNumberは1-21を(必要に応じて)繰り返しますが、「シナリオ」が偶数の場合は、「値」に入る項目が少なすぎます。コードのどの部分がシナリオだけでも1つの短いことになっているのか分かりません。SQL再帰的なCTEが予期せず交互のセットを返します

以下は、私が使用しているコードの結果です。

Scenario RowNumber Value Vals 
1 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 4 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 5 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 6 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 7 A A,A,A,A,A,A,A,A,A,A,A,A,B,C 
1 8 A A,A,A,A,A,A,A,A,A,A,A,B,C 
1 9 A A,A,A,A,A,A,A,A,A,A,B,C 
1 10 A A,A,A,A,A,A,A,A,A,B,C 
1 11 A A,A,A,A,A,A,A,A,B,C 
1 12 A A,A,A,A,A,A,A,B,C 
1 13 A A,A,A,A,A,A,B,C 
1 14 A A,A,A,A,A,B,C 
1 15 A A,A,A,A,B,C 
1 16 A A,A,A,B,C 
1 17 A A,A,B,C 
1 18 A A,B,C 
1 19 A B,C 
1 20 B C 
1 21 C 
2 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 4 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 5 A A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 6 A A,A,A,A,A,A,A,A,A,A,A,B,B,C 
2 7 A A,A,A,A,A,A,A,A,A,A,B,B,C 
2 8 A A,A,A,A,A,A,A,A,A,B,B,C 
2 9 A A,A,A,A,A,A,A,A,B,B,C 
2 10 A A,A,A,A,A,A,A,B,B,C 
2 11 A A,A,A,A,A,A,B,B,C 
2 12 A A,A,A,A,A,B,B,C 
2 13 A A,A,A,A,B,B,C 
2 14 A A,A,A,B,B,C 
2 15 A A,A,B,B,C 
2 16 A A,B,B,C 
2 17 A B,B,C 
2 18 B B,C 
2 19 B C 
2 20 C 
2 21 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,C 
3 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 4 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 5 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 6 A A,A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 7 A A,A,A,A,A,A,A,A,A,A,A,B,C,C 
3 8 A A,A,A,A,A,A,A,A,A,A,B,C,C 
3 9 A A,A,A,A,A,A,A,A,A,B,C,C 
3 10 A A,A,A,A,A,A,A,A,B,C,C 
3 11 A A,A,A,A,A,A,A,B,C,C 
3 12 A A,A,A,A,A,A,B,C,C 
3 13 A A,A,A,A,A,B,C,C 
3 14 A A,A,A,A,B,C,C 
3 15 A A,A,A,B,C,C 
3 16 A A,A,B,C,C 
3 17 A A,B,C,C 
3 18 A B,C,C 
3 19 B C,C 
3 20 C C 
3 21 C 
4 1 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 2 A A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 3 A A,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 4 A A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 5 A A,A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 6 A A,A,A,A,A,A,A,A,A,A,B,B,B,C 
4 7 A A,A,A,A,A,A,A,A,A,B,B,B,C 
4 8 A A,A,A,A,A,A,A,A,B,B,B,C 
4 9 A A,A,A,A,A,A,A,B,B,B,C 
4 10 A A,A,A,A,A,A,B,B,B,C 
4 11 A A,A,A,A,A,B,B,B,C 
4 12 A A,A,A,A,B,B,B,C 
4 13 A A,A,A,B,B,B,C 
4 14 A A,A,B,B,B,C 
4 15 A A,B,B,B,C 
4 16 A B,B,B,C 
4 17 B B,B,C 
4 18 B B,C 
4 19 B C 
4 20 C 

これは私が上記のサンプルを生成するために使用したコードです。どこが間違っていますか?

CREATE TABLE #temp3 
     (
     Scenario INT 
     ,Vals VARCHAR(64) 
     ,LEN INT 
     ) 
     ; 
     WITH vals AS 
      (
      SELECT 
       v.* 
      FROM 
       (VALUES ('A'), ('B'), ('C')) v(x) 
      ), 
     CTE AS 
       (
       SELECT CAST('A' AS VARCHAR(MAX)) AS STR, 0 AS LEN 
       UNION ALL 
       SELECT (CTE.STR + ',' + vals.x), CTE.LEN + 1 
       FROM 
        CTE 
       JOIN vals 
        ON vals.x >= RIGHT(CTE.STR, 1) 
       WHERE CTE.LEN < 19 
       ) 
     INSERT INTO #temp3 
     SELECT 
      ROW_NUMBER() OVER(ORDER BY STR + ',C') AS Scenario 
      ,STR + ',C' AS Vals 
      ,LEN 
     FROM 
      CTE 
     WHERE 
      STR + 'C' LIKE '%B%' 
      AND LEN = 19 
      ; 

     -- Split strings created above into individual characters 

     WITH cte(Scenario, Value, Vals) AS 
     (
      SELECT 
       Scenario 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) AS Value 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') AS Vals 
      FROM #temp3 
      UNION ALL 
      SELECT 
       Scenario 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') 
      FROM cte 
      WHERE Vals > '' 
     ) 

     SELECT 
      Scenario 
      ,ROW_NUMBER() OVER (PARTITION BY Scenario ORDER BY Scenario) RowNumber 
      ,Value 
      ,Vals 
     FROM cte t 

答えて

0

私はあなたが記述されている問題が何であるかを正確にわからないんだけど、ROW_NUMBER()は完全に各パーティション内の行を順序付けORDER BY句を使用する必要があります。

「PARTITION BYシナリオORDER BYシナリオ」を使用する場合、ROW_NUMBER()値が割り当てられる順序は未定義です。試してみてください

WITH cte(Scenario, depth, Value, Vals) AS 
     (
      SELECT 
       Scenario, 0 depth 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) AS Value 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') AS Vals 
      FROM #temp3 
      UNION ALL 
      SELECT 
       Scenario, depth+1 
       ,CAST(LEFT(Vals, CHARINDEX(',',Vals+',')-1) AS VARCHAR(10)) 
       ,STUFF(Vals, 1, CHARINDEX(',',Vals+','), '') 
      FROM cte 
      WHERE Vals > '' 
     ) 

     SELECT 
      Scenario 
      ,depth 
      ,ROW_NUMBER() OVER (PARTITION BY Scenario ORDER BY depth) RowNumber 
      ,Value 
      ,Vals 
     FROM cte t 
関連する問題