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 :

Requêtes imbriquées et Affichage résultat


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Requêtes imbriquées et Affichage résultat
    Hello tout le monde

    je me heurte à un problème pour afficher les résultats d'une imbrication de requête !

    je vous explique.

    Ma première requête est la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct fam_cdr from mgfam where fam_cdf in (select art_cdf from mgart where art_noart in (select vul_noart from mgvul where vul_cdfo='NUMERO DU FOURNISSEUR'));
    elle me retourne les rayons associés à une fournisseur
    elle fonctionne très bien mais je suis obligé de rentrer mes numéros de fournisseur 1 par 1, du coup j'ai créé ma liste de fournisseur via la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select fou_cdfo from mgfou where fou_cdfo NOT IN (select distinct eplg_cdfour from enplg
    J'aimerai donc que le résultat de ma requête m'indique les fam_cdr de chaque résultat de la seconde !

    J'ai tester d''imbriquer les deux requêtes pour que avoir les resultats combinés, j'ai essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select fam_cdr from mgfam where fam_cdf in (select art_cdf from mgart where art_noart in (select vul_noart from mgvul where vul_cdfo='(select fou_cdfo from mgfou where fou_cdfo NOT IN (select distinct eplg_cdfour from enplg) '))
    mais j'ai un message d'erreur m'indiquant 'sous-requete ramenant un enregistrement de plus d'une ligne ce qui est le but

  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 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Vous pouvez continuez avec les IN / NOT IN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select distinct fam_cdr 
    from   mgfam 
    where  fam_cdf in (select art_cdf 
                       from   mgart 
                       where  art_noart in (select vul_noart 
                                            from   mgvul 
                                            where  vul_cdfo IN (select fou_cdfo 
                                                                from   mgfou 
                                                                where  fou_cdfo NOT IN (select eplg_cdfour 
                                                                                        from   enplg))));
    Cependant il serait peut être temps d'apprendre ce qu'est une jointure !
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT fam_cdr 
    FROM   mgfam AS FM
           JOIN mgart AS AR             ON FM.fam_cdf = AR.art_cd
           JOIN mgvul AS VL             ON AR.art_noart = VL.vul_noart
           JOIN mgfou AS FO             ON VL.vul_cdfo = FO.fou_cdfo
           LEFT OUTER JOIN enplg AS PG  ON FO.fou_cdfo = PG.eplg_cdfou
    WHERE  PG.eplg_cdfou IS NULL;
    A +

  3. #3
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup je n'ai plus l'erreur mais je n'ai pas les résultats que j'attends .. j'obtiens bien une liste de rayon mais je voulais une liste de rayon par fournisseur je vais continuer dans cette voie pour trier

    Merci pour les jointures, je vais tâcher de regarder cela

  4. #4
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Par contre avec la jointure proposée (merci je crois avoir compris le principe du coup)

    j'ai une erreur SQL Commande not properly ended (ligne 2 colonne 12) soit au niveau du AS apparement

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Cette requête est tout à fait valide sur tous les SGBDR appliquant le SQL normatif. Comme vous n'avez pas respecter la règle de postage en indiquant pas votre SGBDR, impossible de vous aider davantage.... Mais je soupçonne que vous êtes sous Oracle.

    A l'avenir respecter la règle de postage. ça évite de faire perdre du temps à tous. A vous comme à nous !!!!
    https://www.developpez.net/forums/a6...gage-sql-lire/

    A +

  6. #6
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Ah oui désolé

    je suis bien sur Oracle via sqldeveloper

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Oracle ne respecte pas la norme SQL et ne veut pas de l'opérateur AS pour aliasser une table. Récrivez la requête comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT fam_cdr 
    FROM   mgfam FM
           JOIN mgart AR             ON FM.fam_cdf = AR.art_cd
           JOIN mgvul VL             ON AR.art_noart = VL.vul_noart
           JOIN mgfou FO             ON VL.vul_cdfo = FO.fou_cdfo
           LEFT OUTER JOIN enplg PG  ON FO.fou_cdfo = PG.eplg_cdfou
    WHERE  PG.eplg_cdfou IS NULL;
    Pour avoir en sus le fournisseur, rajoutez dans la clause SELECT la ou les colonnes manquantes.

    A +

  8. #8
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup @SQLPro

    j'ai refait ma requete avec les jointures, j'obtiens ce que je veux ! Il ne me reste qu'une question de tri !

    Voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT DISTINCT arv_cdfo, arv_noart, fam_cdr, arv_novar
    FROM mgarv
        JOIN mgart          ON mgart.art_noart = mgarv.arv_noart
        JOIN mgfam          ON mgfam.fam_cdf = mgart.art_cdf
        JOIN mgfou          ON mgfou.fou_cdfo = mgarv.arv_cdfo
    WHERE arv_cdfo NOT IN (select distinct eplg_cdfour from enplg)
    AND arv_flnoncd = 'O'
    AND mgfou.fou_cdblfr is NULL
    ORDER BY arv_cdfo, arv_novar
    j'aimerai afficher les couples de résultats suivants

    Nom : tri.png
Affichages : 407
Taille : 8,4 Ko

    a savoir un couple de 2 arv_noart différents, ayant un fam_cdr différents mais un arv_cdfo et arv_novar identique

    Merci d'avance

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 302
    Points : 39 647
    Points
    39 647
    Billets dans le blog
    9
    Par défaut
    Je ne comprends pas ce que vous cherchez à faire, la clause ORDER BY est d'un usage très simple, citez simplement les colonnes dans l'ordre du tri souhaité :

    ORDER BY Col1, Col2, ..., Coln

  10. #10
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Comme indiqué je souhaite avoir des couples d'enregistrement comme sur l'image où

    cdfo et grv sont identique mais les cdr et art différents

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 302
    Points : 39 647
    Points
    39 647
    Billets dans le blog
    9
    Par défaut
    Si vous ne voulez que ces lignes là (ce n'est toujours pas clair pour moi désolé), alors faites comme ceci :

    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
    SELECT DISTINCT arv_cdfo, arv_noart, fam_cdr, arv_novar
    FROM mgarv
    INNER JOIN mgart ON mgart.art_noart = mgarv.arv_noart
    INNER JOIN mgfam ON mgfam.fam_cdf   = mgart.art_cdf
    INNER JOIN mgfou ON mgfou.fou_cdfo  = mgarv.arv_cdfo
    WHERE NOT EXISTS
         (select 1
          from enplg
          where eplg_cdfour = mgarv.arv_cdfo)
      AND arv_flnoncd = 'O'
      AND mgfou.fou_cdblfr is NULL
      AND EXISTS
         (select 1
          from mgarv       SUB1
          inner join mgfam sub2
             on sub2.fam_cdf   = SUB1.art_cdf
          where SUB1.arv_cdfo  = mgarv.arv_cdfo 
            and SUB1.arv_novar = mgarv.arv_novar 
            and SUB1.arv_noart > mgarv.arv_noart  
            and SUB2.fam_cdr  <> mgfam.fam_cdr)
    ORDER BY arv_cdfo, arv_novar
    Remarquez que j'ai remplacé votre requete WHERE arv_cdfo NOT IN (select distinct eplg_cdfour from enplg) par un test d'existence, qui sera plus performant dans la plupart des cas

Discussions similaires

  1. Requêtes imbriquées pour affichage tableau
    Par CedriZero dans le forum Requêtes
    Réponses: 0
    Dernier message: 21/09/2015, 09h38
  2. [MySQL] Affichage résultat requête SQL dans page HTML comme un tableau
    Par joxbl dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/03/2011, 14h26
  3. [SQL] Affichage résultat requête dans un tableau, bouton affichage page
    Par megapacman dans le forum PHP & Base de données
    Réponses: 35
    Dernier message: 18/05/2006, 16h42
  4. [MySQL] Affichage requête imbriquée
    Par sql dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/04/2006, 21h48
  5. Affichage résultat de requête dans un champ
    Par dj-julio dans le forum WinDev
    Réponses: 1
    Dernier message: 18/01/2006, 10h51

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