Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server CTE — Znajdź najwyższy identyfikator nadrzędny dla każdego identyfikatora podrzędnego?

Nie możesz zrobić czegoś takiego?

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

Umieść CROSS APPLY po definicję CTE - w jedną instrukcję SQL, która odwołuje się do CTE. Czy to by nie zadziałało??

LUB: - odwróć swoją logikę - wykonaj "odgórne" CTE, które najpierw wybiera węzły najwyższego poziomu, a następnie iteruje przez hierarchię. W ten sposób możesz łatwo określić "ojca najwyższego poziomu" w pierwszej części rekurencyjnego CTE - mniej więcej tak:

;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 dałoby ci węzły coś takiego (na podstawie twoich przykładowych danych, nieco rozszerzone):

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

Teraz, jeśli wybierzesz konkretny węzeł podrzędny z tego wyniku CTE, zawsze otrzymasz wszystkie potrzebne informacje – w tym „poziom” podrzędnego i jego najwyższy poziom węzła nadrzędnego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 Wydajność w kolumnie geograficznej z wartościami null z indeksem przestrzennym

  2. Jak przechowywać i pobierać obrazy w bazie danych serwera sql za pośrednictwem VB.NET?

  3. Jak wstawić do SQL rekordy z wyszukanymi wartościami?

  4. Zarządzaj dostępem do encji i uprawnieniami za pomocą Entity Framework

  5. Zakres zmiennych, które są zdefiniowane w ramach bloku while w procedurach składowanych - SQL Server