【问题标题】:Common Table Expression Counters with 2 Unions具有 2 个并集的公用表表达式计数器
【发布时间】:2011-02-18 13:47:36
【问题描述】:

如果我有一个有母亲和父亲的家庭的公用表表达式,我如何增加“世代”计数器?一个家庭应该将孩子作为第 0 代,将父母作为第 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 

【问题讨论】:

    标签: sql sql-server tsql recursion common-table-expression


    【解决方案1】:

    一口气改变一个代沟里的亲戚看看,而不是在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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2011-03-14
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多