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 :

Requête récursive pour parcourir une nomenclature


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut Requête récursive pour parcourir une nomenclature
    Bonjour,


    J'essaie de mettre au point une requête pour éclater une nomenclature, et j'ai besoin d'une peu d'aide.
    Merci d'avance.
    La nomenclature se présente de la façon suivante(j'ai réduit drastiquement le nb de lignes et de colonnes!):
    BOM Number Mat Number
    2000022 2001770
    2000022 2003496
    2000022 2001527
    2000022 2003495
    2000246 2002005
    2000506 2000246
    2000837 2000246
    2001527 2001528
    2001533 2000246
    2001770 2001771
    2001780 2000246
    2002292 2000506
    2002395 2002292
    2002565 2000837
    2002566 2002565
    2002875 2002566
    2003495 2002875
    2003496 2002395
    L'ensemble 2000022 est le haut de la nomenclature.

    Je cherche tous les chemins qui mènent à l'article 2002005. Il y en a 4:

    2002005, 2000246, 2000506, 2002292, 2002395, 2003496, 2000022
    2002005, 2000246, 2000837, 2002565, 2002566, 2002875, 2003495, 2000022
    2002005, 2000246, 2001533, 2001528, 2001527, 2000022
    2002005, 2000246, 2001780, 2001772, 2001771, 2001770, 2000022

    Je cherche à utiliser la requête récursive suivante, vue dans l'article de SQLPro, http://sqlpro.developpez.com/cours/s...te-recursives/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH maBOM (PIECE, STEPS, CHEMIN) 
    AS
       (SELECT DISTINCT BOM3.[BOM Number], 0, CAST('2000022' AS VARCHAR(MAX)) 
        FROM   BOM3
    	where [BOM Number]=2000022
        UNION  ALL
        SELECT [Mat Number], b1.STEPS+1, cast(b1.CHEMIN as varchar(max))+', '+cast(b2.[Mat Number] as varchar(max))
        FROM   BOM3 AS b2
               INNER JOIN maBOM AS b1
                     ON b1.PIECE = b2.[BOM Number]) 
    SELECT *
    FROM   maBOM
    where piece=2002005
    Cette requête ne sort que 2 branches parmi les 4:
    2000022, 2003495, 2002875, 2002566, 2002565, 2000837, 2000246, 2002005
    2000022, 2003496, 2002395, 2002292, 2000506, 2000246, 2002005

    Comment faut il que je la modifie pour qu'elle sorte les 4 branches?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 924
    Points : 51 726
    Points
    51 726
    Billets dans le blog
    6
    Par défaut
    J'ai récrit votre requête et fait une table test avec un jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE BOM3 
    (BOM_Number  CHAR(7),  Mat_Number CHAR(7));
    GO
    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
    INSERT INTO BOM3 VALUES 
    ('2000022', '2001770'),
    ('2000022', '2003496'),
    ('2000022', '2001527'),
    ('2000022', '2003495'),
    ('2000246', '2002005'),
    ('2000506', '2000246'),
    ('2000837', '2000246'),
    ('2001527', '2001528'),
    ('2001533', '2000246'),
    ('2001770', '2001771'),
    ('2001780', '2000246'),
    ('2002292', '2000506'),
    ('2002395', '2002292'),
    ('2002565', '2000837'),
    ('2002566', '2002565'),
    ('2002875', '2002566'),
    ('2003495', '2002875'),
    ('2003496', '2002395');
    GO

    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 maBOM (PIECE_DEP, PIECE_ARV, STEPS, CHEMIN) 
    AS
       (SELECT DISTINCT BOM_Number, Mat_Number, 0, CAST(Mat_Number AS VARCHAR(MAX)) 
        FROM   BOM3
    	WHERE  BOM_Number= '2000022'
        UNION  ALL
        SELECT BOM_Number, Mat_Number, b1.STEPS+1, 
    	       b1.CHEMIN + ', ' + b2.Mat_Number
        FROM   maBOM AS b1
               INNER JOIN BOM3 AS b2
                     ON b1.PIECE_ARV = b2.BOM_Number) 
    SELECT *
    FROM   maBOM
    WHERE PIECE_ARV='2002005'
    mais je n'arrive pas à voir ou est le problème. En tout état de cause je pense que le problème vient du jeu de données, pas de la requête !

    A +

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 924
    Points : 51 726
    Points
    51 726
    Billets dans le blog
    6
    Par défaut
    2002005, 2000246, 2001533, 2001528, 2001527, 2000022 --> ce chemin est faux, pas de lien entre 2001528 et 2001533
    2002005, 2000246, 2001780, 2001772, 2001771, 2001770, 2000022 --> ce chemin est faux, pas de lien entre 2001771 et 2001772

    A +

  4. #4
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Bonjour SQLPro,

    Merci pour vos 2 réponses.
    Je m'apprêtais effectivement à tester mes données, selon votre dernier retour.
    Je conclus que la requête est correcte, mais que je me suis planté en construisant le jeux d'essais!
    Merci encore pour votre aide tant sur le forum que sur votre blog.
    Philippe PONS

Discussions similaires

  1. [AC-2010] Requête récursive pour parcourir une nomenclature
    Par Philippe PONS dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/07/2014, 10h48
  2. Requête récursive pour parcourir une nomenclature (Suite)
    Par Philippe PONS dans le forum Développement
    Réponses: 4
    Dernier message: 03/07/2014, 15h09
  3. [MySQL] Requête SQL pour charger une structure récursive
    Par FMaz dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/07/2009, 06h00
  4. Fonctions récursives pour parcourir un arbre
    Par mikedavem dans le forum C
    Réponses: 4
    Dernier message: 05/06/2006, 13h00
  5. Requête SQL pour insérer une donnée BINAIRE ?
    Par Najdar dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/05/2006, 11h21

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