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

Langage SQL Discussion :

[SQL Server] Requête récursive


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut [SQL Server] Requête récursive
    Bonjour !

    Tout d’abord, merci de lire ce message et de bien vouloir m’aider. Voici mon problème. J’ai la structure de base de données suivante dans Microsoft SQL Server 2005.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE Task (
      TaskId        INTEGER NOT NULL IDENTITY PRIMARY KEY,
      TaskName      VARCHAR(50) NOT NULL);
     
    CREATE TABLE SubTask (
      TaskId        INTEGER NOT NULL,
      SubTaskId     INTEGER NOT NULL,
      PRIMARY KEY(TaskId, SubTaskId), 
      FOREIGN KEY(TaskId) REFERENCES Task(TaskId),
      FOREIGN KEY(SubTaskId) REFERENCES Task(TaskId));
    Il s’agit donc de deux tables qui permettent la gestion de différentes tâches (Task). Une tâche peut avoir une ou plusieurs sous-tâches et une sous-tâches peut avec une ou plusieurs sous-sous-tâches et ainsi de suite. Jusqu’ici, tout vas bien et je crois bien avoir modélisé le concept.

    Cependant, j’aimerais créer une requête SQL qui me permet d’obtenir une hiérarchie (incluant tout les niveaux) de toutes ces tâches en une seule et même requête. J’ai pensé essayer de faire une requête récursive, mais je n’y arrive pas.

    Merci beaucoup de votre aide !

    Martin :D

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Il faut que tu fasses une procédure stockée. La syntaxe des procédures stockées dépend du SGBD. Réfères toi au forum SQL Server. Merci

  3. #3
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Je ne suis pas convaincu que la meilleure facon est une Stored Proc. Personne ne connais le WITH avec SQL-99 ?

    Merci !

    Martin

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    J'en suis convaincue car une mise en forme de hiérarchie ou la mise en ordre d'une hiérarchie ne se fait pas en soufflant dessus...

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    margagn tu as bien raison, les requêtes récursives sont là pour ça, mais ce serait sympa que tu postes ce que tu as essayé !
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    un sujet similaire a été posté : http://www.developpez.net/forums/vie....php?p=2681815

    bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je ne suis pas certain de bien comprendre ton besoin, mais voici une requête qui permet de reconstituer la hiérarchie en fonction de la tache de plus haut niveau :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH Hierarchie (TaskId, SubTaskId, Tete, Niveau, Chaine) AS
    ( SELECT Null, TaskId, TaskId, 1, CAST(TaskID as varchar(max))
      FROM Task a
      WHERE NOT EXISTS (SELECT NULL
                        FROM SubTask b
                        WHERE a.TaskId = b.SubTaskId)
      UNION ALL
      SELECT a.TaskId, a.SubTaskId, Tete, Niveau + 1, Chaine + '/' + cast(a.SubTaskId as varchar(10))
      FROM SubTask a INNER JOIN Hierarchie b ON a.TaskId = b.SubTaskId )
    SELECT b.TaskName AS Tache, c.TaskName AS SousTache, d.TaskName AS TachePrincipale
    FROM Hierarchie a INNER JOIN Task b on a.TaskId    = b.TaskId
                      INNER JOIN Task c on a.SubTaskId = c.TaskId
                      INNER JOIN Task d on a.Tete      = d.TaskId;
    Pour se restreindre à une seule Tache de plus haut niveau, il suffit d'ajouter WHERE Tete = 1 (par exemple).

    En remplaçant la requête finale par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Replicate( ' ',Niveau * 5) + TaskName
    FROM Hierarchie a INNER JOIN Task b ON a.SubTaskId = b.TaskId
    ORDER BY chaine
    on obtient une liste sous la forme (sans limitation (presque) de profondeur :

    • Tache Principale 1
      [list:a09aabc54d]Tache 11
      [list:a09aabc54d]sousTache 111
      sousTache 112

    Tache 12
    • sousTache 121
    [/list:u:a09aabc54d][/list:u:a09aabc54d]
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut
    Fantastique ! Je vais très certainement essayer cette requête avec le WITH car je n'y comprends pas grand chose... Mais bon, par la pratique je vais y arriver !

    Je vous redonne des nouvelles si cette requête fonctionne ! :)

    Martin

  9. #9
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut
    Super ! Ca fonctionne ! Du moins, ca fonctionne mieux que tout ce que j'ai réussi à date !

    Je vais continuer à étudier cette requête et construire dessus ! :D

    Merci ! :D

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB2005 & SQL SERVER]requête sur plusieurs DB
    Par Kropernic dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/06/2008, 17h53
  2. Réponses: 12
    Dernier message: 30/01/2007, 13h37
  3. [sql server] requête sur dates et heures (format du résultat
    Par isachat666 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h48
  4. [SQL Server] Requête compliquée
    Par Cpt Anderson dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/01/2006, 14h24
  5. [SQL Server]Requête avec DateDiff
    Par sangokus dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 10/05/2004, 14h44

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