如果我有一个包含母亲和父亲的家庭的公共(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/