• With the data you have provided, you will get 'duplicates' because there are different ways to end up at 603 from 602. Some paths use 2 steps, some 3 and some 4, so it is a valid path at all three hierachies.

    Try the following:

    DML and data seed

    create table sandyha

    (

    ContractDateID int,

    PredecessorContractDateID int

    )

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (570 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (572 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (574 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (576 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (578 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (580 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (582 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (584 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (586 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (588 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (596 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (604 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (605 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (606 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (607 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (608 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (609 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (610 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (611 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (612 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (613 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (614 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (615 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (616 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (617 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (618 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (619 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (620 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (621 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (622 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (623 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (624 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (625 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (626 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (627 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (630 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (601 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (590 ,NULL)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (597 ,570)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (598 ,570)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (592 ,570)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (571 ,570)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (573 ,572)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (592 ,572)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (599 ,574)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (575 ,574)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (577 ,576)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (592 ,576)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (595 ,576)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (602 ,578)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (579 ,578)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (581 ,580)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (602 ,580)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (602 ,582)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (583 ,582)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (585 ,584)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (592 ,584)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (592 ,586)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (587 ,586)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (589 ,588)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (599 ,588)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (592 ,590)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (591 ,590)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (593 ,592)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (594 ,592)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (599 ,592)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (600 ,599)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (602 ,599)

    insert into sandyha (ContractDateID, PredecessorContractDateID) values (603 ,602)

    CTE query

    with CTE as

    (

    SELECT

    s.ContractDateID,

    s.PredecessorContractDateID,

    1 as level,

    cast(cast(coalesce(s.PredecessorContractDateID,'') as nvarchar(5)) as nvarchar(255)) as DHPath

    FROM

    sandyha s

    WHERE

    s.PredecessorContractDateID is null

    UNION ALL

    SELECT

    s.ContractDateID,

    s.PredecessorContractDateID,

    (x.level +1) as level,

    cast(x.DHPath + '-' + cast(coalesce(s.PredecessorContractDateID,'') as nvarchar(5)) as nvarchar(255)) as DHPath

    FROM

    sandyha s

    join

    cte x on x.ContractDateID = s.PredecessorContractDateID

    WHERE

    s.PredecessorContractDateID is not null

    )

    select distinct * from CTE order by contractdateID,level

    you will get the following results set (partial shown)

    ConPrevLvlPath

    60360230-578-602

    60360230-580-602

    60360230-582-602

    60360240-574-599-602

    60360240-588-599-602

    60360250-570-592-599-602

    60360250-572-592-599-602

    60360250-576-592-599-602

    60360250-584-592-599-602

    60360250-586-592-599-602

    60360250-590-592-599-602

    So you can get to 603 through 3, 4 or 5 predecessors, depending on where you start.

    What is the business problem you are trying to solve?