Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erfassen Sie rekursiv alle Daten basierend auf einer übergeordneten ID

Dies kann in SQL Server 2005 und höher mithilfe von Common Table Expressions (CTEs) erfolgen. Hier ist ein großartiger Link von MSDN, der rekursive Abfragen beschreibt:Recursive Queries Using Common Table Expressions

Hier ist ein Beispiel:

Wenn Sie sich eine hierarchische Reihe von Personen vorstellen, können Sie mit dieser Abfrage die vollständige Reihe jeder Person sehen UND ihren Platz in der Hierarchie berechnen. Es kann geändert werden, um jede untergeordnete Beziehung zu finden.

Anstelle der ID der Person tauschen Sie die ID der Zeile aus, die Sie als übergeordnetes Element verwenden.

--Create table of dummy data
create table #person (
personID integer IDENTITY(1,1) NOT NULL,
name      varchar(255) not null,
dob       date,
father    integer
);

INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL);  
INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null);
INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1);
INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1);
INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4);
INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3);

DECLARE @OldestPerson INT; 
SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family

WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS
(
   SELECT
      personID
      ,Name
      ,dob
      ,father,
      1 as HierarchyLevel
   FROM #person
   WHERE personID = @OldestPerson

   UNION ALL

   SELECT
    e.personID,
      e.Name,
      e.dob,
      e.father,
      eh.HierarchyLevel + 1 AS HierarchyLevel
   FROM #person e
      INNER JOIN PersonHierarchy eh ON
         e.father = eh.personID
)

SELECT *
FROM PersonHierarchy
ORDER BY HierarchyLevel, father;

DROP TABLE #person;