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 :
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
Ce qui me donne comme TreeView :
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
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
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
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
 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
Si vous avez une idée, je suis preneur
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