【问题标题】:SQL recursive CTESQL 递归 CTE
【发布时间】:2017-05-24 18:33:43
【问题描述】:

我有一个列,我需要在该列中继续查找与该列中的原始记录关联的最后一条记录值。

select rec1, val1 from table1:

rec1   val1    
a1    t1      
t1    t2    
t2    null

a2    t7

t7    null

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

我希望有一种“简单”的方法来实现这一点。我已经尝试过,但无法取得太大进展。 谢谢

【问题讨论】:

  • 这不是用游标解决的。相反,您需要递归 CTE。
  • 是的,是的。并且标题也需要编辑。
  • 我改了标题。您能否发布一个示例查询?
  • 你试过谷歌搜索Recursive CTE吗? Stack Overflow 不是免费的代码编写服务
  • WITH RECURSIVE t(n) AS ( VALUES (1) UNION ALL SELECT n+1 FROM t WHERE n < 100 ) SELECT sum(n) FROM t;

标签: sql sql-server loops


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2012-04-23
    • 2014-05-19
    • 2017-01-02
    相关资源
    最近更新 更多