Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Récupérer de manière récursive toutes les données basées sur un identifiant parent

Cela peut être fait dans SQL Server 2005 et versions ultérieures à l'aide d'expressions de table communes (CTE). Voici un excellent lien de MSDN décrivant les requêtes récursives :Requêtes récursives utilisant des expressions de table communes

Voici un exemple :

Si vous imaginez une ligne hiérarchique de personnes, cette requête vous permettra de voir la ligne complète de toute personne ET de calculer sa place dans la hiérarchie. Il peut être modifié pour trouver n'importe quelle relation enfant.

Au lieu de l'ID de la personne, vous échangez l'ID de la ligne que vous utilisez comme parent.

--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;