sql >> Databáze >  >> RDS >> Sqlserver

SQL Server CTE – najít nejvyšší parentID pro každé childID?

Nemůžete něco takového udělat?

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

Vložte CROSS APPLY po definice CTE - do jediného příkazu SQL, který odkazuje zpět na CTE. Nefungovalo by to??

NEBO: - otočte svou logiku - proveďte "shora dolů" CTE, která nejprve vybere uzly nejvyšší úrovně a poté iteruje hierarchií. Tímto způsobem můžete snadno určit "otce nejvyšší úrovně" v první části rekurzivního CTE - něco takového:

;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

To by vám dalo uzly něco takového (na základě vašich ukázkových dat, mírně rozšířené):

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

Pokud nyní z tohoto výstupu CTE vyberete konkrétní podřízený uzel, vždy získáte všechny potřebné informace – včetně „úrovně“ podřízeného uzlu a jeho nadřazeného uzlu nejvyšší úrovně.



  1. Postgres vybere všechny sloupce, ale seskupí je podle jednoho sloupce

  2. Vyberte pouze sloupce bez hodnot Null v Oracle

  3. Chyba syntaxe MySQL při provádění SQL dotazu

  4. Zkontrolujte připojení k databázi, jinak zobrazte zprávu