0

SQL Server 2005 で再帰的な CTE クエリを作成しようとしていますが、奇妙な結果が得られます。私のテーブルは次のとおりです。

PairID  ChildID ParentID
900        1        2       
901        2        3       
902        3        4       

これは私のCTEクエリです:

WITH TESTER (PairID, 
             ChildID, 
             ParentID, 
             Level)
AS (SELECT a.PairID, a.ChildID,a.ParentID, 0 AS Level
    FROM BusinessHierarchy AS a
    UNION ALL
    SELECT b.PairID, b.ChildID, b.ParentID, oh.Level + 1 AS Level
    FROM BusinessHierarchy AS b INNER JOIN
    TESTER AS oh ON b.ChildID =  oh.ParentID)
SELECT 
      x.PairID, 
      x.ChildID,
      x.ParentID,
      x.Level
 FROM TESTER AS x
 ORDER BY x.Level, x.ChildID, x.ParentID

わかりましたので、データセットが返されましたが、次のように繰り返しが含まれているため、期待どおりではありません。

PairID  ChildID ParentID Level
900     1       2        0
901     2       3        0
902     3       4        0
...

900     2       3        1
901     3       4        1
...

900     3       4        2

なぜこれが起こっているのか、どうすれば修正できるのかを誰かが説明してくれたら、とても感謝しています.

私の最後の質問に関する限り、次のように各親で最初の childID を表示するには、どのように変更する必要がありますか?

Original
PairID  ChildID ParentID Level
900     1       2        0
901     2       3        1
902     3       4        2

I want it displayed as:
PairID  ChildID ParentID Level
900     1       2        0
901     1       3        1
902     1       4        2
4

1 に答える 1

1

あなたの問題はあなたの出発点です。CTE クエリの最初の部分では、すべての行が返されます (レベルがすべて 0 であることに注意してください)。

その後 - クエリの次の部分に進み、関連するすべての行を取得します (以前の結果セットに追加されます)。

ただし、ID 4 のレコードがないことに気付きました

もしそうなら、あなたがすることは次のとおりです。

;WITH TESTER (PairID, ChildID, ParentID, Level) AS (
    SELECT
        a.PairID,
        a.ChildID,
        a.ParentID,
        0 AS Level
    FROM BusinessHierarchy AS a
    LEFT JOIN BusinessHierarchy a2 ON a.ParentID = a2.ChildID
    WHERE a2.PairID is null

    UNION ALL

    SELECT
        b.PairID,
        b.ChildID,
        b.ParentID,
        oh.Level + 1 AS Level
    FROM BusinessHierarchy AS b
    INNER JOIN TESTER AS oh ON b.ParentID =  oh.ChildID
)

SELECT 
    x.PairID, 
    x.ChildID,
    x.ParentID,
    x.Level
FROM TESTER AS x
ORDER BY x.Level, x.ChildID, x.ParentID

また、正しい並べ替え順序を表示するには、同様の質問に対する私の回答を参照してください (パスを使用)

于 2010-01-11T22:42:55.803 に答える