Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server CTE – Top parentID forEach childID finden?

Können Sie so etwas nicht tun?

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

Setzen Sie das CROSS APPLY nach die CTE-Definition - in die eine SQL-Anweisung, die auf den CTE zurückverweist. Würde das nicht funktionieren??

ODER: - Drehen Sie Ihre Logik um - Führen Sie einen "Top-Down" -CTE durch, der zuerst die Knoten der obersten Ebene auswählt und dann die Hierarchie durchläuft. Auf diese Weise können Sie den "Vater der obersten Ebene" im ersten Teil des rekursiven CTE leicht bestimmen - etwa so:

;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

Dies würde Ihnen Knoten in etwa wie folgt geben (basierend auf Ihren Beispieldaten, leicht erweitert):

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

Wenn Sie nun einen bestimmten untergeordneten Knoten aus dieser CTE-Ausgabe auswählen, erhalten Sie immer alle Informationen, die Sie benötigen - einschließlich der "Ebene" des untergeordneten Knotens und seines übergeordneten Knotens der obersten Ebene.