【问题标题】:Is it possible to utilize Recursive CTE in this example?在这个例子中是否可以使用递归 CTE?
【发布时间】:2021-03-15 20:33:53
【问题描述】:
IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL DROP TABLE #MyTable
create table #MyTable (PolNo varchar(50), ControlNo int, PrevControlNo int, Premim money)
insert into #MyTable values ('Policy-00', 5000, NULL, 1000),
                            ('Policy-01', 6000, 5000, 3200),
                            ('Policy-02', 7000, 6000, 4500),
                            ('Policy-03', 8000, 7000, 3800)
select * from #MyTable

原始输出如下所示:


使用递归 CTE 是否可以得到如下结果?

我尝试过这样的事情,但它基本上给了我相同的结果:

;with cte as (
select m.PolNo, m.ControlNo, PrevControlNo, 1 as lvl
from #MyTable m
union all 
select c.PolNo, c.ControlNo, c.PrevControlNo, c.lvl+1
from cte c
inner join #MyTable m ON m.ControlNo = c.PrevControlNo
where c.PrevControlNo IS  NULL
) 
select cte.PolNo,  ControlNo, PrevControlNo
from cte

【问题讨论】:

  • 你是如何管理递归的?在你预期的输出中,Policy-03(控件8000)的前一个控件是7000,它本身的前一个控件是6000等等。如果你只担心1直接前一个控件,那么你可以做一个简单的自我加入没有 CTE。
  • 啊,是的,没错。我想我把一切都复杂化了。谢谢

标签: sql-server tsql common-table-expression recursive-query recursive-cte


【解决方案1】:

LEFT JOIN 单关就够了:

SELECT *
FROM #MyTable m1
LEFT JOIN #MyTable m2
  ON m2.ControlNo = m1.PrevControlNo;

db<>fiddle demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多