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

Uzyskaj rekordy zawierające wszystkie rekordy podrzędne na serwerze sql

Musisz użyć rekurencyjnego wyrażenia tabelowego, a następnie przefiltrować wyniki tylko dla ścieżki bazowej dla każdego rekordu (np. dla ID 1131 uzyskaj ABC/RST/UVW a nie tylko ABC/RST

WITH CTE AS
(   SELECT  ID, 
            Name, 
            ParentID, 
            NextParentID = ParentID, 
            Path = CAST(Name AS VARCHAR(MAX)),
            Recursion = 1
    FROM    T
    UNION ALL
    SELECT  CTE.ID, 
            CTE.Name, 
            CTE.ParentID, 
            T.ParentID, 
            CAST(T.Name + '/' + CTE.Path AS VARCHAR(MAX)),
            Recursion + 1
    FROM    CTE
            INNER JOIN T
                ON CTE.NextParentID = T.ID
), CTE2 AS
(   SELECT  CTE.ID,
            CTE.Name,
            CTE.ParentID,
            CTE.Path,
            RowNumber = ROW_NUMBER() OVER(PARTITION BY CTE.ID ORDER BY Recursion DESC)
    FROM    CTE
)
SELECT  ID, Name, ParentID, Path
FROM    CTE2
WHERE   RowNumber = 1;

Przykład SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CZY.LICZBA('07213E71') =Prawda?

  2. Obliczanie odległości między dwoma punktami (szerokość geograficzna, długość geograficzna)

  3. Jak wygenerować skrypty upuszczania unikalnych ograniczeń w bazie danych SQL Server — samouczek SQL Server / TSQL część 99

  4. Usługi niewidoczne w programie SQL Server Configuration Manager

  5. Podczas próby zapisania raportu SSRS pojawia się dziwny błąd