I have seen numerous examples on this, but none do exactly what I need…and I am having a hard time figuring it out. (all the examples I see list the results in 2 columns…I don’t need that)
I have a table named ‘Documents’ with 2 columns
- Id
- ParentId (nullable)
Like so…
CREATE TABLE [dbo].[Document](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [int] NULL
)
Populated as such…
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;
I need to recursively traverse the parent-child relationship (until NULL) & get a list of all the Id’s into a single column, like so…
Advertisement
Answer
(I assume based on syntax that you are using SQL Server.)
You can use a recursive 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 is a SQL Fiddle.
Note:  You cannot insert (normally) into a column declared as identity.  If you want to put in the values, remove the identity() attribute.
