Счетчики общих таблиц с двумя объединениями - PullRequest
2 голосов
/ 12 мая 2010

Если у меня есть общее табличное выражение для семьи с матерью и отцом, как я могу увеличить счетчик «Поколение»? В семье должен быть ребенок нулевого поколения, родители - поколение 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 

1 Ответ

4 голосов
/ 12 мая 2010

Измените вид соединения на родственников в одном поколении, а не 2 рекурсивных предложения в CTE. 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 
...