0
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

原始输出如下所示:

![PolNo ControlNo PrevControlNo Premim Policy-00 5000 NULL 1000.00 Policy-01 6000 5000 3200.00 Policy-02 7000 6000 4500.00 Policy-03 8000 7000 3800.00


使用递归 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
4

1 回答 1

1

LEFT JOIN单级就足够了:

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

db<>小提琴演示

于 2020-12-03T19:44:26.977 回答