Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server CTE -Rechercher l'ID parent supérieur pour chaque ID enfant ?

Vous ne pouvez pas faire quelque chose comme ça ?

;WITH cte AS (....)
SELECT
    * 
FROM 
    cte
CROSS APPLY 
    dbo.myTable tbl ON cte.XXX = tbl.XXX

Mettez le CROSS APPLY après la définition CTE - dans la seule instruction SQL qui renvoie au CTE. Cela ne fonctionnerait-il pas ? ?

OU : - retournez votre logique - faites un CTE "descendant", qui sélectionne d'abord les nœuds de niveau supérieur, puis parcourt la hiérarchie. De cette façon, vous pouvez facilement déterminer le "père de niveau supérieur" dans la première partie du CTE récursif - quelque chose comme ceci :

;WITH ChildParent AS
(
    SELECT
        ID,
        ParentID = ISNULL(ParentID, -1),
        SomeName, 
        PLevel = 1,   -- defines level, 1 = TOP, 2 = immediate child nodes etc.
        TopLevelFather = ID  -- define "top-level" parent node
    FROM dbo.[Agent_Agents] 
    WHERE ParentID IS NULL

    UNION ALL

    SELECT
        a.ID,
        ParentID = ISNULL(a.ParentID, -1),
        a.SomeName, 
        PLevel = cp.PLevel + 1,
        cp.TopLevelFather   -- keep selecting the same value for all child nodes
    FROM dbo.[Agent_Agents] a
    INNER JOIN ChildParent cp ON r.ParentID = cp.ID
)
SELECT  
   ID,
   ParentID,
   SomeName,
   PLevel,
   TopLevelFather   
FROM ChildParent

Cela vous donnerait quelque chose comme ceci (basé sur vos exemples de données, légèrement étendu) :

ID  ParentID  SomeName      PLevel  TopLevelFather
20    -1      Top#20           1          20
 4    -1      TOP#4            1           4
 8    -1      TOP#8            1           8
 7     8      ChildID = 7      2           8
 3     7      ChildID = 3      3           8
 2     4      ChildID = 2      2           4
 9    20      ChildID = 9      2          20
 5     9      ChildID = 5      3          20
 1     5      ChildID = 1      4          20

Désormais, si vous sélectionnez un nœud enfant particulier à partir de cette sortie CTE, vous obtiendrez toujours toutes les informations dont vous avez besoin, y compris le "niveau" de l'enfant et son nœud parent de niveau supérieur.