首页 > 解决方案 > SQL Server CTE 和递归示例误区

问题描述

有人可以帮我cte表达吗?我有一张桌子:

旧卡 新卡 dt
111 555 2020-01-09
222 223 2020-02-10
333 334 2020-03-11
444 222 2020-04-12
555 666 2020-05-12
666 777 2020-06-13
777 888 2020-07-14
888 0 2020-08-15
999 333 2020-09-16
223 111 2020-10-16

我需要得到old_carda 的所有更改new_card,因为old_card数字 111 到new_card数字 0。所以我必须从这个表中获取 5 条记录,只有 a new_card= 0 作为输入参数

旧卡 新卡 dt
111 555 2020-01-09
555 666 2020-05-12
666 777 2020-06-13
777 888 2020-07-14
888 0 2020-08-15

我想用 来做cte,但我从源表中获取所有记录,不明白为什么。这是我的cte:

;with cte as(
select 
    old_card,
    new_card,
    dt
from 
    cards_transfer 
where
    new_card = 0
union all
select 
    t1.old_card,
    t1.new_card,
    t1.dt 
from 
    cards_transfer t1
    inner join 
        cte on cte.old_card = t1.new_card)

但我得到了 8 行。有人可以告诉我我做错了什么吗?

标签: tsqlcommon-table-expression

解决方案


你说你想要从那111以后。所以你需要添加那个“停止”条件

where cte.old_card <> 111

;with cte as(
select 
    old_card,
    new_card,
    dt
from 
    cards_transfer 
where
    new_card = 0
union all
select 
    t1.old_card,
    t1.new_card,
    t1.dt 
from 
    cards_transfer t1
    inner join 
        cte on cte.old_card = t1.new_card
where cte.old_card <> 111
)

推荐阅读