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

Développement SQL Server Discussion :

[Transac SQL] double récursivité ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut [Transac SQL] double récursivité ?
    Bonjour à tous,

    je fais face à un problème que je n'arrive pas à résoudre. Voici la table est les données que j'utilise pour tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    CREATE TABLE test
    (
    	COMMANDE int NOT NULL,
    	COLIS int  NOT NULL,
     CONSTRAINT PK_test PRIMARY KEY CLUSTERED (COMMANDE ASC, COLIS ASC) 
    );
     
    insert into test(COMMANDE,COLIS) values (5001,8001),(5002,8001),(5002,8002),(5001,8003),(5003,8003),(5003,8004),(5004,8004),(5005,8004),(5005,8005),(5005,8006)

    Dans cette table, nous associons des commandes à des colis. Cependant, une commande peut être composée de plusieurs colis et un colis peut contenir plusieurs commandes.


    Je souhaiterais pouvoir récuperer toutes les commandes liées de près ou de loin à un colis passé en paramètre.

    Pour ce faire, j'ai trouvé la page suivante: http://msdn.microsoft.com/fr-fr/library/ms175972.aspx

    Cette page semble poser les bases de mon problème mais j'ai l'impression d'avoir besoin d'une double recursivité.

    voici ce que j'ai essayé de faire sans succès:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    USE ma_bdd;
    GO
    WITH DirectReports (COMMANDE, COLIS)
    AS
    (
    -- Anchor member definition
        SELECT d.COMMANDE, d.COLIS
        FROM test AS d
        UNION ALL
        SELECT d.COMMANDE, d.COLIS
        FROM test AS d
        INNER JOIN revertReports AS e
            ON d.COMMANDE = e.COMMANDE)
     
    GO
    WITH revertReports (COMMANDE, COLIS)
    AS
    (
    -- Anchor member definition
        SELECT d.COMMANDE, d.COLIS
        FROM test AS d
        UNION ALL
        SELECT d.COMMANDE, d.COLIS
        FROM test AS d
        INNER JOIN DirectReports AS e
            ON d.COLIS = e.COLIS
    )
     
    -- Statement that executes the CTE
    SELECT COMMANDE, COLIS
    FROM DirectReports
    WHERE COLIS = 8006;
    GO

    En esperant que vous pourrez m'aider à surmonter cela, Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si j'ai bien compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select T1.commande, T1.colis 
      from test as T1
     where exists (select null
                     from test as T2
                    where T2.commande = T1.commande
                      and T2.colis = 8006)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    Merci mais malheureusement cela ne convient pas.

    La requete ne retourne que les résultats suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    5005 - 8004
    5005 - 8005
    5005 - 8006
    dans l'exemple donné, je devrais retrouver tous les colis de 8001 a 8006 car :

    colis 8006 contient la commande 5005 qui comporte egalement les colis 8004 et 8005,

    le colis 8004 contient egalement les commandes 5003 et 5004 qui elles même comportent le colis 8003.

    Le colis 8003 contient egalement la commande 5001 qui......
    Images attachées Images attachées  

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    comment reconnait-on la commande mère ?

    edit : en fait je ne saurai pas faire, il manque une relation sur la commande mère .. et la vous n'auriez plus de problème pour retrouver vos petits

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    Bonjour,

    tout le problème est la. il n'y a pas de commande mère à proprement parler.

    Ce n'est pas une hiérarchie comme vous pouvez le voir sur le schéma (il n'y a pas de chef en dessous duquel viennent des subordonnés)

    Il faudrait qu'a partir de n'importe quel colis d'entré, je puisse retrouver toutes les commandes associées

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    une piste mais c'est moche .... il faudrai pouvoir limité l'effet itératif, et ca je ne sais pas trop comment le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with recursive tmp(commande, colis, com_mere, level) as 
    (
    select commande, colis, commande, 0
    from t_comm
    where commande = 5001
    union all
    select b.commande, b.colis, b.commande, a.level + 1
    from tmp a
    inner join t_comm b on (a.commande <> b.commande and a.colis = b.colis) or (a.com_mere = b.commande and a.colis <> b.colis)
    where a.level < 5)
     
    select distinct commande, colis
    from tmp

Discussions similaires

  1. [TRANSAC SQL] conversion du type d'un parametre
    Par pinocchio dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/05/2008, 11h35
  2. [SQL] Double requête avec jointure
    Par frakosun dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 17/01/2008, 15h03
  3. [TRANSAC SQL] compréhension exemple transaction
    Par pinocchio dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2006, 17h27
  4. [TRANSAC-SQL] Problème dbcc shrinkfile
    Par Cyborg289 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 21/09/2006, 13h42
  5. requete SQL double références ...
    Par khardros dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/09/2004, 19h15

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