IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Requete en cascade


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 90
    Par défaut Requete en cascade
    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

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Il y a un tutoriel ici pour aider à la gestion d'arborescence : http://sqlpro.developpez.com/cours/arborescence/

    Une solution pour limiter les requêtes serait de faire générer par SQL Server une structure XML (avec le mot-clé FOR XML) que tu utiliserais dans le code client pour peupler la treeview.

Discussions similaires

  1. [MySQL] Requete en cascade
    Par nickoeuh dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/05/2008, 10h47
  2. [SQL] requete en cascade ?
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/11/2007, 17h31
  3. imbrication de 2 requetes en cascade
    Par @rkane dans le forum Access
    Réponses: 4
    Dernier message: 11/09/2006, 23h32
  4. Requetes de suppression en cascade
    Par log2n dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 20/05/2005, 10h07
  5. Sous requete en cascade ou curseur ??
    Par HULK dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 31/12/2004, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo