Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вземете записи, съдържащи всички дъщерни записи в sql сървъра

Трябва да използвате рекурсивен израз на обща таблица, след което да филтрирате резултатите само за основния път за всеки запис (т.е. за ID 1131 вземете ABC/RST/UVW а не само 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;

Пример за 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. Могат ли SQL Server Data Tools да работят с SQL Server 2008 SSIS?

  2. Кхмерски Unicode, английски и Microsoft SQL Server 2008 водят до въпросителни

  3. Архивирайте база данни в SQL Server 2017

  4. SQL заявка; хоризонтално към вертикално

  5. Невъзможно е да се съхраняват определени формати за дата и час в SQL Server