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 :
EmployeeID | FirstName | LastName | Title | DeptID | ManagerID |
---|---|---|---|---|---|
1 | Ken | Sanchez | Chief Executive Officer | 16 | NULL |
273 | Brian | Welcker | Vice President of Sales | 3 | 1 |
274 | Stephen | Jiang | North American Sales Manager | 3 | 273 |
275 | Michael | Blythe | Sales Representative | 3 | 274 |
276 | Linda | Mitchell | Sales Representative | 3 | 274 |
285 | Syed | Abbas | Pacific Sales Manager | 3 | 273 |
286 | Lynn | Tsoflias | Sales Representative | 3 | 285 |
287 | David | Bradley | Marketing Manager | 4 | 273 |
288 | Mary | Gibson | Marketing Specialist | 4 | 287 |
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éponses à « Les requêtes récursives (partie 1/3) »
CTE mon ami 🙂
J’aimeJ’aime
[…] SQL, la récursivité. La solution réside dans les 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 […]
J’aimeJ’aime
[…] le premier article, nous posons les bases du problème. Dans le deuxième article, nous expliquons ce que sont les […]
J’aimeJ’aime