sql >> Database >  >> RDS >> Sqlserver

SQL Server CTE -Find top parentID forEach childID?

Kun je zoiets niet doen?

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

Zet de CROSS APPLY na de CTE-definitie - in de ene SQL-instructie die terugverwijst naar de CTE. Zou dat niet werken??

OF: - draai je logica om - voer een "top-down" CTE uit, die eerst de knooppunten op het hoogste niveau kiest en vervolgens door de hiërarchie loopt. Op deze manier kunt u eenvoudig de "vader op het hoogste niveau" in het eerste deel van de recursieve CTE bepalen - ongeveer als volgt:

;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

Dit zou u knooppunten geven zoals dit (gebaseerd op uw voorbeeldgegevens, enigszins uitgebreid):

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

Als u nu een bepaald kindknooppunt selecteert uit deze CTE-uitvoer, krijgt u altijd alle informatie die u nodig hebt, inclusief het "niveau" van het onderliggende knooppunt en het bovenliggende knooppunt op het hoogste niveau.



  1. Hoe kan ik ervoor zorgen dat de Redshift/Postgresql LAG-vensterfunctie records selectief uitsluit?

  2. Gegevens importeren naar MySQL vanuit MS SQL

  3. Backquote/backticks gebruiken voor mysql-query's

  4. MySql, PHP-weergave Afbeelding op HTML