如何使用 SQL 一直追溯记录到原点

How to trace back a record all the way to origin using SQL

我们是一个名为 ticketing 的 table,负责跟踪所有服务单。一张票可以导致另一张票,导致另一张票,由下面的 replaced_by_ticket_id 字段指示

| ticket_id | is_current | replaced_by_ticket_id |
|-----------|------------|-----------------------|
| 134       | 0          | 240                   |
| 240       | 0          | 321                   |
| 321       | 1          | Null                  |
| 34        | 0          | 93                    |
| 25        | 0          | 16                    |
| 16        | 0          | 25                    |
| 93        | 1          | Null                  |

如何编写查询以获取导致当前票数(321 和 93)的票数?我的意思是我可以自己加入table,但是不知道加入了多少次。加上不同的门票有不同的级别。

这里是查询的预期结果

| ticket_id | total_tickets |
|-----------|---------------|
| 321       | 3             |
| 93        | 4             |

最好的方法是什么?

你可以使用递归查询;诀窍是跟踪原始的“当前”票证,因此您可以在外部查询中根据该票证进行汇总。

所以:

with cte as (
    select ticket_id, ticket_id as parent_id from ticketing where is_current = 1
    union all
    select c.ticket_id, t.ticket_id
    from ticket t
    inner join cte c on c.parent_id = t.replaced_by_ticket_id
)
select ticket_id, count(*) total_tickets
from cte
group by ticket_id