我有一个存储层次结构详细信息的表,如下所示
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。
答案 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;