SQL选择单个行的“历史记录”中的所有行

时间:2019-10-30 15:46:19

标签: sql sqlite

我有一个看起来像这样的表:

ID | PARENT_ID
--------------
0  | NULL
1  | 0
2  | NULL
3  | 1
4  | 2
5  | 4
6  | 3

作为一个SQL新手,我不确定是否可以在一个命令中完成我想要的事情。

我想从第6行开始,并使用PARENT_ID列引用ID列来递归地遵循“历史记录”。

(在我看来)结果应该类似于:

6|3
3|1
1|0
0|NULL

我已经尝试过这样的事情:

SELECT T1.ID 
FROM Table T1, Table T2 
WHERE T1.ID = 6 
   OR T1.PARENT_ID = T2.PARENT_ID;

但这给了我一个奇怪的结果。

1 个答案:

答案 0 :(得分:0)

使用recursive cte
如果要从最大值id开始,

with recursive cte (id, parent_id) as (
  select t.*
  from (
    select *
    from tablename
    order by id desc
    limit 1
  ) t
  union all
  select t.*
  from tablename t inner join cte c
  on t.id = c.parent_id
)  

select * from cte

请参见demo
如果要专门从id = 6开始:

with recursive cte (id, parent_id) as (
  select *
  from tablename
  where id = 6
  union all
  select t.*
  from tablename t inner join cte c
  on t.id = c.parent_id
)
select * from cte; 

请参见demo
结果:

| id  | parent_id |
| --- | --------- |
| 6   | 3         |
| 3   | 1         |
| 1   | 0         |
| 0   |           |