SQL在层次结构表中获取特定级别父级

时间:2014-07-15 19:02:41

标签: sql sql-server

我有一个存储层次结构详细信息的表,如下所示

id      parentid        Level
------------------------------
1       null            Unit1
2       1               Unit2
3       1               Unit2
4       1               Unit2
5       2               Unit3  
6       3               Unit3
7       4               Unit3
8       5               Unit4
9       6               Unit4
10      7               Unit4
11      7               Unit4

需要sql来获取任何给定id的Unit3父级。基本上,我需要查询结果给我看

id      parentid        Level   Unit3Parent
-------------------------------------------
1       null            Unit1   null
2       1               Unit2   null
3       1               Unit2   null
4       1               Unit2   null
5       2               Unit3   2
6       3               Unit3   3
7       4               Unit3   4
8       5               Unit4   2
9       6               Unit4   3
10      7               Unit4   4
11      7               Unit4   4

请注意,unit3Parent列始终仅显示2,3或4。

2 个答案:

答案 0 :(得分:0)

create function fnGetParent(@ID int)
returns int
as
begin
declare @p as int
  Select @p=t.parentID from table1 t where t.ID=@ID
  if @p>4 
  begin
  set @p= fnGetParent(@p)
  end  
  return @p 
end


select a.*, fnGetParent(a.ID) unit3parent
from table1 a
order by a.ID asc

答案 1 :(得分:0)

我认为你可以使用以下查询获得结果。递归查询保持跟踪层次结构。如果级别为1,则返回null,如果level为2则返回其自身的父ID,如果级别为3则返回父级的父级。

WITH parents(id,parentid,level,unit3level,unit3parent)
AS
(
   SELECT id,parentid,level,1,NULL 
   FROM tableName WHERE parentid IS NULL

   UNION ALL

   SELECT t.id,t.parentid,t.level, p.unit3level + 1, 
          CASE p.unit3level     WHEN  3 THEN p.parentid 
                                WHEN  2 THEN t.parentid
                                ELSE NULL END
   FROM tableName t JOIN parents p ON t.parentid = p.id

)
SELECT id,parentid,level,unit3parent
FROM parents;