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

Znalezienie rodzica najwyższego poziomu w SQL

Aby to osiągnąć, możesz użyć rekurencyjnego CTE:

DECLARE @childID INT 
SET @childID  = 1 --chield to search

;WITH RCTE AS
(
    SELECT *, 1 AS Lvl FROM RelationHierarchy 
    WHERE ChildID = @childID

    UNION ALL

    SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh
    INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId
)
SELECT TOP 1 id, Name
FROM RCTE r
inner JOIN dbo.Person p ON p.id = r.ParentId
ORDER BY lvl DESC

Demo SQLFiddle

EDYTUJ - zaktualizowana prośba dla rodziców na najwyższym poziomie dla wszystkich dzieci:

;WITH RCTE AS
(
    SELECT  ParentId, ChildId, 1 AS Lvl FROM RelationHierarchy 

    UNION ALL

    SELECT rh.ParentId, rc.ChildId, Lvl+1 AS Lvl 
    FROM dbo.RelationHierarchy rh
    INNER JOIN RCTE rc ON rh.ChildId = rc.ParentId
)
,CTE_RN AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY r.ChildID ORDER BY r.Lvl DESC) RN
    FROM RCTE r

)
SELECT r.ChildId, pc.Name AS ChildName, r.ParentId, pp.Name AS ParentName
FROM CTE_RN r
INNER JOIN dbo.Person pp ON pp.id = r.ParentId
INNER JOIN dbo.Person pc ON pc.id = r.ChildId
WHERE RN =1

Demo SQLFiddle

EDYTUJ2 - aby wszystkie osoby zmieniły nieco JOINS na końcu:

SELECT pc.Id AS ChildID, pc.Name AS ChildName, r.ParentId, pp.Name AS ParentName
FROM dbo.Person pc 
LEFT JOIN CTE_RN r ON pc.id = r.CHildId AND  RN =1
LEFT JOIN dbo.Person pp ON pp.id = r.ParentId

Wersja demonstracyjna SQLFiddle



  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 - Jak przechowywać i nawigować w hierarchiach?

  2. Jak łatwo i szybko sparametryzować ciąg o wartości null za pomocą DBNull.Value?

  3. Jaki typ danych powinien być używany do przechowywania numerów telefonów w SQL Server 2005?

  4. Dlaczego nie mogę wykonać funkcji agregującej na wyrażeniu zawierającym agregację, ale mogę to zrobić, tworząc wokół niego nową instrukcję select?

  5. Optymalizacja TempDB:unikanie wąskich gardeł i problemów z wydajnością