Logo SQL Server

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

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.

Publicités

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

N'hésitez pas à laisser un commentaire. Vous contribuerez à l'amélioration de ce blog :

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s