使用SQL在单列中生成父子ID的完整列表

时间:2018-02-10 15:14:30

标签: sql sql-server

我已经看到了很多关于此的例子,但没有一个完全符合我的要求......而且我很难搞清楚它。 (我看到的所有例子都将结果列在2栏中......我不需要那样)

我有一个名为'Documents'的表,有2列

  • 编号
  • ParentId(可空)

像这样...

CREATE TABLE [dbo].[Document](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [int] NULL
)

这样填充......

INSERT INTO [dbo].[Document] SELECT 1, NULL;
INSERT INTO [dbo].[Document] SELECT 2, 1;
INSERT INTO [dbo].[Document] SELECT 3, 2;
INSERT INTO [dbo].[Document] SELECT 4, NULL;
INSERT INTO [dbo].[Document] SELECT 5, 4;
INSERT INTO [dbo].[Document] SELECT 6, NULL;

我需要以递归方式遍历父子关系(直到NULL)&获取所有Id的列表到一个列中,如此...

enter image description here

1 个答案:

答案 0 :(得分:3)

(我假设你使用SQL Server的语法。)

您可以使用递归CTE:

with cte as (
      select id, parentid, 1 as lev
      from document d
      where id = 3
      union all
      select d.id, d.parentid, lev + 1
      from cte join
           document d
           on cte.parentid = d.id
     )
select id
from cte
order by lev;

Here是一个SQL小提琴。

注意:您不能(通常)插入声明为identity的列。如果您想要输入值,请删除identity()属性。