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 :

récursivité ou auto-jointure


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
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut récursivité ou auto-jointure
    Bonjour,

    J'ai une relation d'auto-jointure sur une table "department".
    Je voudrais retrouver tous les sous-départements d'un département donné.

    Je peux faire une requête d'auto-jointure :

    SELECT D1.departmentId
    FROM department D1, department D2
    WHERE D1.departmentId = D2.parentdepartment

    mais je ne peux pas spécifier avec celà à partir de quel département je veux chercher ses sous-départements.

    ces données doivent ensuite être enregistrées dans une table temporaire utilisée dans la suite de ma stored procedure, il me semble donc que la récursivité risque d'être difficile à mettre en place.

    Pouvez-vous m'aider svp?

  2. #2
    Membre confirmé Avatar de Poisson59
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 213
    Par défaut
    Bonjour,

    A quoi ca sert de faire joindre la meme table

    dis ce qui a dans ta table department

    donne nous un exemple de ton résultat final

    CDLT

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    ma table est

    CREATE TABLE [dbo].[DEPARTMENTS](
    [DEPARTMENT_ID] [uniqueidentifier] NOT NULL,
    [NAME] [varchar](255) NOT NULL,
    [PARENT_DEPARTMENT] [uniqueidentifier] NULL,
    CONSTRAINT [DEPARTMENTS_PK] PRIMARY KEY CLUSTERED
    )

    CONSTRAINT [DEPARTMENTS_DEPARTMENTS_FK1] FOREIGN KEY([PARENT_DEPARTMENT])

    Donc PARENT_DEPARTMENT pointe vers le département auquel il appartient
    Je voudrais donc réussir à obtenir l'arborescence. C'est à dire que si je donne un DEPARTEMENT_ID, il faut que je retourne tous les sous-départements.

    J'espère que j'ai réussit à expliquer un peu plus clairement

  4. #4
    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

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Salut,

    a priori ta requête est juste.

    Sauf qu'il faut ajouter (A tester j'ai pas eu le temps de le faire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
       D.DepartementID, --ID du departement
       D.NAME, -- Nom du departemnt
       SOUSDEP.departmentId, --ID de sous departement
       SOUSDEP.NAME -- Nom du sous-departement
    FROM department D INNER  department SOUSDEP
    ON SOUSDEP.parentdepartment = D.departmentId
    WHERE D.departmentId = XXX
    Bien sur, cela suppose que tu n'as que des départements et sous-départements dans ta base. Si tu as des sous-sous-département , là ca marchera pas car il te faut restreindre la profondeur de recherche. Et d'après la script de création de ta table, tu n'as pas les niveaux

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Justement, le hic est qu'il y a une profondeur indéterminée. Chaque département peut avoir plusieurs sous-départements et chaque sous-département peut également avoir plusieurs sous-départements et ainsi de suite jusqu'à tomber sur le niveau le plus bas

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Citation Envoyé par oolon
    Justement, le hic est qu'il y a une profondeur indéterminée. Chaque département peut avoir plusieurs sous-départements et chaque sous-département peut également avoir plusieurs sous-départements et ainsi de suite jusqu'à tomber sur le niveau le plus bas
    Pas de panique ca pourrait être simple :

    Je ne connais pas les données, mais il y a de forte chances que la valeur de parentdepartement soit NULL ou initialisée par une valeur par défaut pour les départements (puisqu'ils n'ont pas de parents)

    Considérons les premiers cas (valeur NULL), ceci devrait marcher (j'en suis pas sur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
       D.DepartementID, --ID du departement
       D.NAME, -- Nom du departemnt
       SOUSDEP.departmentId, --ID de sous departement
       SOUSDEP.NAME -- Nom du sous-departement
    FROM department D INNER  department SOUSDEP
    ON SOUSDEP.parentdepartment = D.departmentId
    WHERE D.departmentId = XXX
    AND D.parentDepartement IS NULL)

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

Discussions similaires

  1. Requête avec auto jointure récalcitrante
    Par vmolines dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 21h31
  2. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02
  3. Trier la hierarchie d'une auto-jointure
    Par Oberown dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/10/2005, 16h18
  4. resultat d'une auto jointure
    Par slc dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/09/2004, 13h54
  5. Auto jointure speciale
    Par kv000 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/04/2004, 13h02

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