Sql 使用CTE确定家庭成员的特定层次ID
我试图弄清楚如何在使用CTE时将递增ID附加到我的结果集 我的表格包含如下数据:Sql 使用CTE确定家庭成员的特定层次ID,sql,sql-server,tsql,common-table-expression,hierarchy,Sql,Sql Server,Tsql,Common Table Expression,Hierarchy,我试图弄清楚如何在使用CTE时将递增ID附加到我的结果集 我的表格包含如下数据: PersonId ParentLinkId Relation Name 1 NULL F John Doe 2 1 S Jane Doe 3 1 C Jack Doe 4 1 C
PersonId ParentLinkId Relation Name
1 NULL F John Doe
2 1 S Jane Doe
3 1 C Jack Doe
4 1 C Jill Doe
我想添加一个名为RelationId的列。基本上,“F”人总是得到“1”,关系“S”总是得到“2”,任何后续的“C”关系都会得到3、4、5……等等
它们由ParentLinkId链接,因此ParentLinkId=PersonId
我试图使用CTE递归地增加这个值,但我一直被困在一个无限循环中
我试过:
WITH FinalData( ParentId, ParentLinkId, Name, Relationship, RelationshipId) AS
(
SELECT ParentId
,ParentLinkId
,Name
,Relationship
,1
FROM FamTable
WHERE ParentLinkId IS NULL
UNION ALL
SELECT FT.ParentId
,ParentLinkId
,Name
,Relationship
,RelationshipId + 1
FROM FamTable FT
INNER JOIN FinalData ON FT.ParentLinkId = FinalData.ParentId
)
SELECT * FROM
FinalData
这是我不断得到的结果:
PersonId ParentLinkId Relation Name RelationshipId
1 NULL F John Doe 1
2 1 S Jane Doe 2
3 1 C Jack Doe 2
4 1 C Jill Doe 2
应该是
PersonId ParentLinkId Relation Name RelationshipId
1 NULL F John Doe 1
2 1 S Jane Doe 2
3 1 C Jack Doe 3
4 1 C Jill Doe 4
我想我正在接近使用CTE,但任何在正确方向上的帮助或推动都将不胜感激 这听起来像是一个简单的
行编号()
:
他是一把小提琴
select f.*,
row_number() over (partition by coalesce(ParentLinkId, PersonId)
order by (case when relation = 'F' then 1
when relation = 'S' then 2
when relation = 'C' then 3
end), PersonId
) as relationId
from famtable f;