SQLite -递归查询以基于父级获取值

8oomwypt  于 2023-04-21  发布在  SQLite
关注(0)|答案(1)|浏览(209)

我有一个SQLite表,它的结构类似于以下内容:
| ID|类型|父ID|
| --------------|--------------|--------------|
| 一千|A|一千零五十|
| 一千零一|B|一零六七|
| 一千零二||一千|
| 一千零三|C|一千一百|
| 一千零四|B|一三七八|
| 一千零五||一千零二|
| 一千零六|||
我需要创建一个SQL查询,返回所有使用PARENT_ID填充TYPE列的记录,其中TYPE列为空,忽略那些没有PARENT_ID的记录。结果应该如下所示:
| ID|类型|父ID|
| --------------|--------------|--------------|
| 一千|A|一千零五十|
| 一千零一|B|一零六七|
| 一千零二|A|一千|
| 一千零三|C|一千一百|
| 一千零四|B|一三七八|
| 一千零五|A|一千零二|
| 一千零六|||
您将注意到,对于ID 1005,SQL查询将需要使用PARENT_ID进行递归查询,以最终从ID为1000的记录中检索TYPE值A。
我假设SQL中的递归函数将有助于满足此要求,但由于我以前没有使用过递归SQL,因此需要一些帮助来构建SQL查询。
任何帮助将不胜感激。

owfi6suc

owfi6suc1#

您可以使用递归CTE来实现。
递归CTE不会返回任何没有parent_id的记录,因此我们可以简单地使用union all添加它们

WITH cte AS (
  SELECT id, type, parent_id
  FROM mytable 
  WHERE type is not null
  UNION ALL
  SELECT l.id, c.type, l.parent_id
  FROM mytable l 
  INNER JOIN cte c
  ON l.parent_id = c.id
)
SELECT *
from cte
union all
select *
from mytable 
where parent_id is null
order by id

Demo here

相关问题