tsql - 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_card
a 的所有更改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 行。有人可以告诉我我做错了什么吗?
解决方案
你说你想要从那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
)
推荐阅读
- firebase - 仅按用户在 Firebase/Firestore 上查看某些集合
- angular - AmCharts4 - 将 y = 0 轴与多个 y 轴同步
- html - 改变css箭头的方向
- javascript - 如何使用 Javascript 或 Jquery 在页面加载时关闭手风琴(Wordpress)?
- angular - 有没有办法为 Angular 使用的 HTML 创建动态引用?
- json - 将json数据插入elasticsearch的最佳和最有效的方法是什么
- active-directory - 通过组策略将 Adobe 设置为默认程序?
- airflow - 气流警告:第 1 行的“execution_date”列的日期时间值不正确
- swift - PDFPage 的“setBounds”不裁剪应用于 pdfpage 的注释
- latex - 如何在 LaTeX 中对齐分离的方程?