Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8861333
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 14, 20262026-06-14T15:28:11+00:00 2026-06-14T15:28:11+00:00

I have a query which produces flattened hierarchy from a parent-child table (self join,

  • 0

I have a query which produces flattened hierarchy from a parent-child table (self join, adjacent list). The problem is that this query produces NULLs for levels which does not have any child. Now my intention is to ‘backfill’ these levels to produce a table which does not contain any NULL values in level columns. How should I modify this query?

Example data:

SET NOCOUNT ON;
USE Tempdb;

IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL DROP TABLE dbo.Employees;

CREATE TABLE dbo.Employees
(
  empid   INT         NOT NULL PRIMARY KEY,
  mgrid   INT         NULL     REFERENCES dbo.Employees,
  empname VARCHAR(25) NOT NULL,
  salary  MONEY       NOT NULL,
  CHECK (empid <> mgrid),
  CHECK (empid > 0)
);

CREATE UNIQUE INDEX idx_unc_mgrid_empid ON dbo.Employees(mgrid, empid);

INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES
  (1,  NULL, 'David'  , $10000.00),
  (2,  1,    'Eitan'  ,  $7000.00),
  (3,  1,    'Ina'    ,  $7500.00),
  (4,  2,    'Seraph' ,  $5000.00),
  (5,  2,    'Jiru'   ,  $5500.00),
  (6,  2,    'Steve'  ,  $4500.00),
  (7,  3,    'Aaron'  ,  $5000.00),
  (8,  5,    'Lilach' ,  $3500.00),
  (9,  7,    'Rita'   ,  $3000.00),
  (10, 5,    'Sean'   ,  $3000.00),
  (11, 7,    'Gabriel',  $3000.00),
  (12, 9,    'Emilia' ,  $2000.00),
  (13, 9,    'Michael',  $2000.00),
  (14, 9,    'Didi'   ,  $1500.00);

query provided by @Andomar

; with  Tree as
        (
        SELECT  empid
        ,       mgrid
        ,       1 as lv
        ,       1 as level1
        ,       null as level2
        ,       null as level3
        ,       null as level4
        ,       null as level5
        FROM    Employees
        WHERE   mgrid IS NULL 
        UNION ALL
        SELECT  E.empid
        ,       E.mgrid
        ,       T.lv + 1
        ,       T.level1
        ,       case when T.lv = 1 then E.empid else t.level2 end
        ,       case when T.lv = 2 then E.empid else t.level3 end
        ,       case when T.lv = 3 then E.empid else t.level4 end
        ,       case when T.lv = 4 then E.empid else t.level5 end
        FROM    Employees AS E
        JOIN    Tree T
        ON      E.mgrid = T.empid
        )
select  *
from    Tree
order by empid

This yields

+-------+--------+----+--------+--------+--------+--------+--------+
| EMPID | MGRID  | LV | LEVEL1 | LEVEL2 | LEVEL3 | LEVEL4 | LEVEL5 |
+-------+--------+----+--------+--------+--------+--------+--------+
|     1 | (null) |  1 |      1 | (null) | (null) | (null) | (null) |
|     2 | 1      |  2 |      1 | 2      | (null) | (null) | (null) |
|     3 | 1      |  2 |      1 | 3      | (null) | (null) | (null) |
|     4 | 2      |  3 |      1 | 2      | 4      | (null) | (null) |
|     5 | 2      |  3 |      1 | 2      | 5      | (null) | (null) |
|     6 | 2      |  3 |      1 | 2      | 6      | (null) | (null) |
|     7 | 3      |  3 |      1 | 3      | 7      | (null) | (null) |
|     8 | 5      |  4 |      1 | 2      | 5      | 8      | (null) |
|     9 | 7      |  4 |      1 | 3      | 7      | 9      | (null) |
|    10 | 5      |  4 |      1 | 2      | 5      | 10     | (null) |
|    11 | 7      |  4 |      1 | 3      | 7      | 11     | (null) |
|    12 | 9      |  5 |      1 | 3      | 7      | 9      | 12     |
|    13 | 9      |  5 |      1 | 3      | 7      | 9      | 13     |
|    14 | 9      |  5 |      1 | 3      | 7      | 9      | 14     |
+-------+--------+----+--------+--------+--------+--------+--------+

but the idea is to achieve this

+-------+--------+----+--------+--------+--------+--------+--------+
| EMPID | MGRID  | LV | LEVEL1 | LEVEL2 | LEVEL3 | LEVEL4 | LEVEL5 |
+-------+--------+----+--------+--------+--------+--------+--------+
|     1 | (null) |  1 |      1 | 1      | 1      | 1      | 1      |
|     2 | 1      |  2 |      1 | 2      | 2      | 2      | 2      |
|     3 | 1      |  2 |      1 | 3      | 3      | 3      | 3      |
|     4 | 2      |  3 |      1 | 2      | 4      | 4      | 4      |
|     5 | 2      |  3 |      1 | 2      | 5      | 5      | 5      |
|     6 | 2      |  3 |      1 | 2      | 6      | 6      | 6      |
|     7 | 3      |  3 |      1 | 3      | 7      | 7      | 7      |
|     8 | 5      |  4 |      1 | 2      | 5      | 8      | 8      |
|     9 | 7      |  4 |      1 | 3      | 7      | 9      | 9      |
|    10 | 5      |  4 |      1 | 2      | 5      | 10     | 10     |
|    11 | 7      |  4 |      1 | 3      | 7      | 11     | 11     |
|    12 | 9      |  5 |      1 | 3      | 7      | 9      | 12     |
|    13 | 9      |  5 |      1 | 3      | 7      | 9      | 13     |
|    14 | 9      |  5 |      1 | 3      | 7      | 9      | 14     |
+-------+--------+----+--------+--------+--------+--------+--------+
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-14T15:28:12+00:00Added an answer on June 14, 2026 at 3:28 pm

    Just Add the below after the Tree CTE

    Select empid,mgrid,lv,
            level1 = coalesce(level1,Rn),
            level2 = coalesce(level2,Rn),
            level3 = coalesce(level3,Rn),
            level4 = coalesce(level4,Rn),
            level5 = coalesce(level5,Rn)
    from
    (select  empid,mgrid,lv,level1,level2,level3,level4,level5,Row_Number()Over(Order By empid) as Rn
    from    Tree)x
    

    enter image description here

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a query which produces a list of orders like this: Invoice Description
I have a select query which produces the following: select customers.city , books.title from
I have a query which looks like this: SELECT LossCost, CoverageID FROM BGILossCost] WHERE
I have a query which searches two separate fields in the same table... looking
I have a query which returns a series of cells of data from a
I have the following Query which produces the output below; SELECT TBLUSERS.USERID, TBLUSERS.ADusername, TBLACCESSLEVELS.ACCESSLEVELID,
I have a query which takes a very long time to run but produces
I have the following MySQL query, which produces the result I want: SELECT `l`.`status`,
I have a LINQ to SQL query which produces an object of type {System.Data.Linq.DataQuery}.
I have a query which joins 6 tables, produces 800,000 rows, and inserts them

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.