2017-05-24 188 views
0

我有一列需要继续查找与该列中原始记录相关联的最后一条记录值。SQL递归CTE

select rec1, val1 from table1: 

rec1 val1  
a1 t1  
t1 t2  
t2 null 

a2 t7 

t7 null 

该表格(a1,a2)中基本上有2条原始记录。我需要在我的sql查询中将t2与a1相关联,因为链接基于val1列(a1 - > t1 - > t2),直到val1为null。记录a2仅与t7链接,因为t7(a2 - > t7)没有进一步的联系。

我希望有一个'简单'的方法来实现这一点。我尝试过,但无法取得很大进展。 谢谢

+3

这不是用游标解决的。相反,你需要一个递归CTE。 – JNevill

+0

是的,是的。并且标题也需要进行编辑。 –

+0

我改变了标题。你可以发表一个示例查询吗? – user2077110

回答

1

这是一个递归的CTE公式。此版本假定没有循环,并且链中没有超过100个链接:

with cte as (
     select rec1, val1, 1 as lev 
     from table1 t1 
     where not exists (select 1 from table1 tt1 where tt1.val1 = t1.rec1) 
     union all 
     select cte.rec1, t.val1, cte.lev + 1 as lev 
     from cte join 
      table1 t1 
      on t1.val1 = cte.rec1 
    ) 
select * 
from (select cte.*, max(lev) over (partition by rec1) as maxlev 
     from cte 
    ) cte 
where maxlev = lev;