Les requêtes récursives (partie 1/3)

Logo SQL Server

L’objet de ces trois articles est d’aborder un problème qui ne semble pas possible de réaliser simplement avec une requête SQL, la récursivité. La solution réside dans les expressions CTE (expressions de tables communes).

Dans le premier article, nous posons les bases du problème. Dans le deuxième article, nous expliquons ce que sont les expressions CTE. Enfin, le dernier article montre comment la récursivité est traitée avec les expressions CTE.

Description du problème

Dans une table, nous avons une liste de salariés dans une entreprise avec leur manager direct respectif. Voici un exemple de l’organigramme qui nous intéressera dans cet exercice :

Cet organigramme est stocké dans une base de données SQL Server. Voici d’abord le script de création de la table :

CREATE TABLE [dbo].[MyEmployees] (
[EmployeeID] SMALLINT NOT NULL,
[FirstName] NVARCHAR(30) NOT NULL,
[LastName] NVARCHAR(40) NOT NULL,
[Title] NVARCHAR(50) NOT NULL,
[DeptID] SMALLINT NOT NULL,
[ManagerID] SMALLINT NULL,
CONSTRAINT [PK_MyEmployees_EmployeeID] PRIMARY KEY CLUSTERED ([EmployeeID]),
CONSTRAINT [FK_MyEmployees_ManagerID] FOREIGN KEY ([ManagerID]) REFERENCES [dbo].[MyEmployees]([EmployeeID]));

Donc, la représentation de la table avec sa contrainte d’intégrité circulaire ressemble à ceci :

L’étape suivante est donc de remplir la table avec les données qui nous intéresse :

INSERT INTO [dbo].[MyEmployees]([EmployeeID], [FirstName], [LastName], [Title], [DeptID], [ManagerID]) VALUES
(1, N'Ken', N'Sanchez', N'Chief Executive Officer', 16, NULL),
(273, N'Brian', N'Welcker', N'Vice President of Sales', 3, 1),
(274, N'Stephen', N'Jiang', N'North American Sales Manager', 3, 273),
(275, N'Michael', N'Blythe', N'Sales Representative', 3, 274),
(276, N'Linda', N'Mitchell', N'Sales Representative', 3, 274),
(285, N'Syed', N'Abbas', N'Pacific Sales Manager', 3, 273),
(286, N'Lynn', N'Tsoflias', N'Sales Representative', 3, 285),
(287, N'David',N'Bradley', N'Marketing Manager', 4, 273),
(288, N'Mary', N'Gibson', N'Marketing Specialist', 4, 287);

Maintenant, si nous interrogeons la table :

SELECT [EmployeeID], [FirstName], [LastName], [Title], [DeptID], [ManagerID] FROM [dbo].[MyEmployees] ORDER& BY [EmployeeID];

Voici le résultat que nous obtenons :

EmployeeIDFirstNameLastNameTitleDeptIDManagerID
1KenSanchezChief Executive Officer16NULL
273BrianWelckerVice President of Sales31
274StephenJiangNorth American Sales Manager3273
275MichaelBlytheSales Representative3274
276LindaMitchellSales Representative3274
285SyedAbbasPacific Sales Manager3273
286LynnTsofliasSales Representative3285
287DavidBradleyMarketing Manager4273
288MaryGibsonMarketing Specialist4287

Nous sommes loin d’obtenir une requête récursive.

C’est ce que nous allons voir en détail dans les deux prochains articles, maintenant que les bases du problème sont posées.

Bien à vous.

3 réflexions sur “Les requêtes récursives (partie 1/3)

Les commentaires sont fermés.