如何在Common Table中使用递归查询获取第二个父级

时间:2012-04-13 06:23:50

标签: sql sql-server

我正在使用SQL Server 2008.我有一个这样的表:

UnitId ParentId  UnitName
---------------------------
1        0       FirstUnit
2        1       SecondUnit One  
3        1       SecondUnit Two
4        3           B
5        2           C
6        4           D
7        6           E
8        5           F

我想得到记录的第二个父母。例如:

如果我选择等于8的单位id,它将使单位id等于2。它需要是SecondUnit One。或者如果我选择等于7的单位id,它将使单位id等于3。它需要是SecondUnit Two。

如何以这种方式编写SQL查询?

2 个答案:

答案 0 :(得分:6)

我花了一段时间,但现在是:)

with tmp as (
  select unitId, parentId, unitName, 0 as iteration
  from t
  where unitId = 7
  union all
  select parent.unitId, parent.parentId, parent.unitName, child.iteration + 1
  from tmp child
  join t parent on child.parentId = parent.unitId
  where parent.parentId != 0
)
select top 1 unitId, parentId, unitName from tmp
order by iteration desc

这里还有一个fiddle

答案 1 :(得分:1)

SELECT t.*, tParent1.UnitId [FirstParent], tParent2.UnitId [SecondParent]
FROM Table t
    LEFT JOIN Table tParent1 ON t.ParentId = tParent1.UnitId
    LEFT JOIN Table tParent2 ON tParent1.ParentId = tParent2.UnitId
WHERE t.UnitId = <Unit ID search here>
    AND NOT tParent2.UnitId IS NULL

编辑:如果你想要返回结果,即使他们没有第二个父级,也要留下WHERE子句的第二部分。