SQL递归查询和输出

SQL递归查询和输出,sql,hierarchical-data,recursive-query,Sql,Hierarchical Data,Recursive Query,使用以下SQL语句创建表并插入值: create table tb(id int , pid int , name nvarchar(10)) insert into tb values( 1 , null , 'A') insert into tb values( 2 , null , 'B') insert into tb values( 3 , null , 'C') insert into tb values( 4 , 1 , 'D') insert into tb values( 5

使用以下SQL语句创建表并插入值:

create table tb(id int , pid int , name nvarchar(10))
insert into tb values( 1 , null , 'A')
insert into tb values( 2 , null , 'B')
insert into tb values( 3 , null , 'C')
insert into tb values( 4 , 1 , 'D')
insert into tb values( 5 , 1 , 'E')
insert into tb values( 6 , 2 , 'F') 
insert into tb values( 7 , 3 , 'G')
insert into tb values( 8 , 4 , 'H')
insert into tb values( 9 , 5 , 'I')
我希望最终输出显示这棵树从根到叶的每一行,如下所示:

A-D-H
A-E-I
B-F
C-G

有人知道如何编写SQL过程来执行此操作吗?谢谢。

如果您使用的是SQL Server,则可以使用递归查询来解决此问题。Oracle和PostgreSQL中也可以使用类似的方法

with rcte as
(
  select t1.id, t1.pid, cast(t1.name as nvarchar(100)) name
  from tb t1
  where not exists (select 1 from tb t2 where t2.pid = t1.id)
  union all
  select tb.id, tb.pid, cast(concat(tb.name, '-', rcte.name) as nvarchar(100)) name
  from rcte
  join tb on rcte.pid = tb.id
)
select name
from rcte
where rcte.pid is null


它首先找到叶节点,然后遍历到根节点。

您使用的是哪种dbms?