2

母と父を持つ家族に共通のテーブル式がある場合、「世代」カウンターをインクリメントするにはどうすればよいですか? 家族は、子供を世代 0、親を世代 1、4 人の祖父母を世代 2 として持つ必要があります。ただし、ループは祖父母のセットごとに 1 回ずつ、2 回実行されます。

;WITH FamilyTree
AS
(
    SELECT *, 0 AS Generation
    FROM myTable
    WHERE [id] = 99

    UNION ALL
    SELECT name, Generation + 1
    FROM myTable AS Fam
    INNER JOIN FamilyTree
    ON Fam.[id] = FamilyTree.[motherid]

    UNION ALL
    SELECT name, Generation + 1
    FROM myTable AS Fam
    INNER JOIN FamilyTree
    ON Fam.[id] = FamilyTree.[fatherid]
)
SELECT generation, name FROM FamilyTree 
4

1 に答える 1

4

CTE に 2 つの再帰句を含めるのではなく、一度に 1 つのジェネレーション ギャップ内の親戚の結合の外観を変更します。2 つの句は部分的なクロス結合を形成するため、余分な行があります

;WITH FamilyTree
AS
(
    SELECT *, 0 AS Generation
    FROM myTable
    WHERE [id] = 99

    UNION ALL
    SELECT name, Generation + 1
    FROM myTable AS Fam
    INNER JOIN FamilyTree
    ON Fam.[id] IN (FamilyTree.[motherid], FamilyTree.[fatherid])
)
SELECT generation, name FROM FamilyTree 
于 2010-05-12T11:06:31.227 に答える