Bonjour,
Je dois m'occuper d'optimiser un programme qui utilise SQL Serveur 2000. Il se trouve que dans un traitement de remplissage de treeview, je lance des requêtes en cascade. Je m'explique... J'ai une table avec des objets parents et enfants (Id_Obj et Id_Obj_Parent) ou un Parent peut avoir un ou plusieurs enfants et un enfant n'a qu'un Parent. Voici un exemple de données :
Ce qui me donne comme TreeView :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Id_Obj - Id_Obj_Parent - Nom 1 - 0 - Premier 2 - 1 - Enfant 1 3 - 2 - Sous Enfant 1 4 - 1 - Enfant 2 5 - 2 - Sous Enfant 2 6 - 4 - Sous Enfant 3 7 - 1 - Enfant 2 8 - 4 - Sous Enfant 4
Voici ce que j'execute comme requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Premier -> Enfant 1 -> Sous Enfant 1 -> Sous Enfant 2 -> Enfant 2 -> Sous Enfant 3 -> Sous Enfant 4 -> Enfant 3
Je pense que je peux faire quelque chose de plus simple grace à une requête ou à une procédure stockée et une table temporaire. Mais je sais pas exactement comment ?? L'idée serait de donner l'Id de l'objet, son nom et son niveau (Pour savoir si ca doit être un enfant ou pas. Donc dans mon cas j'aurais le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 rs1 = Select * FROM MaTable WHERE Id_Obj=1 AND Id_Obj_Parent=0 --Ensuite pour avoir jusqu'à huit niveau : rs2 = Select * FROM MaTable WHERE Id_Obj_Parent=rs1.Id_Obj rs3 = Select * FROM MaTable WHERE Id_Obj_Parent=rs2.Id_Obj rs4 = Select * FROM MaTable WHERE Id_Obj_Parent=rs3.Id_Obj rs5 = Select * FROM MaTable WHERE Id_Obj_Parent=rs4.Id_Obj rs6 = Select * FROM MaTable WHERE Id_Obj_Parent=rs5.Id_Obj rs7 = Select * FROM MaTable WHERE Id_Obj_Parent=rs6.Id_Obj rs8 = Select * FROM MaTable WHERE Id_Obj_Parent=rs7.Id_Obj rs9 = Select * FROM MaTable WHERE Id_Obj_Parent=rs8.Id_Obj
Si vous avez une idée, je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 1 - Parent - 0 2 - Enfant 1 - 1 3 - Sous Enfant 1 - 2 5 - Sous Enfant 2 - 2 4 - Enfant 2 - 1 6 - Sous Enfant 3 - 2 8 - Sous Enfant 4 - 2 7 - Enfant 2 - 1![]()
merci à tous.
PS: Voici le code qui permet de créer la table exemple et les données exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 CREATE TABLE [dbo].[MaTable] ( [Id_Obj] [int] NOT NULL , [Id_Obj_Parent] [int] NOT NULL , [Nom] [varchar] (50) COLLATE French_CI_AS NOT NULL , ) ON [PRIMARY] GO INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(1, 0, 'Premier') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(2, 1, 'Enfant 1') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(3, 2, 'Sous Enfant 1') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(4, 1, 'Enfant 2') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(5, 2, 'Sous Enfant 2') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(6, 4, 'Sous Enfant 3') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(7, 1, 'Enfant 2') INSERT INTO MaTable(Id_Obj,Id_Obj_Parent,Nom) VALUES(8, 4, 'Sous Enfant 4') GO
Partager