我们是一个名为ticketing
的表,用于跟踪所有服务票证。一张票据可以导致另一张票据,该票据导致下方的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(的票的数量?我的意思是,我可以自己加入桌子,但无法知道加入多少次。另外,不同的门票有不同的级别。
以下是查询的预期结果
| ticket_id | total_tickets |
|-----------|---------------|
| 321 | 3 |
| 93 | 4 |
最好的方法是什么?
您可以使用递归查询;诀窍是跟踪原始的";当前";ticket,因此您可以在外部查询中按此进行聚合。
因此:
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