如何使用 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
我们是一个名为 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