sql - 具有 2 个联合的公用表表达式计数器

标签 sql sql-server t-sql recursion common-table-expression

如果我有一个包含母亲和父亲的家庭的公共(public)表表达式,我如何增加“世代”计数器?一个家庭应该将 child 作为第 0 代,将 parent 作为第 1 代,将四个祖 parent 作为第 2 代。但是循环执行两次,每组祖 parent 一次。

;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 

最佳答案

一次性更改对一代间隙中亲属的连接查看,而不是在 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 

关于sql - 具有 2 个联合的公用表表达式计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2818127/

相关文章:

php - 如果 PHP 不存在,则插入一条 SQL 记录

sql - 根据月份获取最新日期值

php - 使最近的项目更有可能被绘制

mysql - 编写SQL其他优化方式

sql - 按 DESC 反向结果排序

sql - varchar(MAX) 总是更可取吗?

sql-server - sp_ExecuteSql : The parameterized query expects the parameter @XX, 未提供

c# - Azure 故障转移组的 SQL Server 连接字符串

sql-server - 使用T-SQL参数过滤表

sql-server - 必须在sql server中声明标量变量