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

PostgreSQL Discussion :

Requête SQL incomplète [9.1]


Sujet :

PostgreSQL

  1. #1
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut Requête SQL incomplète
    Bonjour,


    Je veux afficher
    - la liste des sociétés ( le nom de la societe => intitule_societe, son numero unique => num_societe, son type => type_societe)
    - la catégorie de la société => categorie
    - et son plan comptable => Plan_comptable

    Pour cela, j'ai besoin de 3 tables ou sont les informations et de 2 tables d'association
    • Base.plancpt_societe => associe le plan comtable et la société
    • Base.asso_cat_societe => associe la categorie et la société


    Il se trouve que 9 sociétés n'ont pas de catégorie et donc ne sont pas associées à une catégorie dans la table d'association => Base.asso_cat_societe.
    Comment faire pour les lister et ne rien afficher dans la catégorie?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 	plancpt_lib.intitule AS Plan_comptable,
    	cat_societe.libelle AS categorie,
    	rsociete.type_societe,
    	rsociete.intitule AS intitule_societe,
    	rsociete.num_societe
    FROM Base.rsociete, Base.plancpt_lib, Base.plancpt_societe, Base.cat_societe, Base.asso_cat_societe
    WHERE plancpt_lib.id = id_plancpt
    AND id_societe = rsociete.idsociete
    AND asso_cat_societe.idsociete = rsociete.idsociete
    AND asso_cat_societe.id_cat_societe = cat_societe.id
    Cordialement,
    Vandman

  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 774
    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 774
    Points : 52 744
    Points
    52 744
    Billets dans le blog
    5
    Par défaut
    Faire des jointures externe !

    Au passage ça fait maintenant 23 ans que les jointures dans le WHERE type "produit cartésien" ont été remplacée par JOIN !!!

    A me lire : http://sqlpro.developpez.com/cours/s...ointures/#LIII

    Il serait peut être temps de s'y mettre !!!

    Bref, formez vous au langage SQL. Mon site web comme mon bouquin peuvent vous y aider....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Je reviens en espérant que la requête soit plus présentable, mais ça fait la même chose. Il me manque les sociétés qui n'ont pas de catégorie?

    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
    SELECT 	plancpt_lib.intitule AS Plan_comptable,
    	cat_societe.libelle AS categorie,
    	rsociete.type_societe,
    	rsociete.intitule AS intitule_societe,
    	rsociete.num_societe
    FROM Base.rsociete
    	LEFT OUTER JOIN Base.asso_cat_societe
    		ON asso_cat_societe.idsociete = rsociete.idsociete
    		JOIN Base.cat_societe
    			ON asso_cat_societe.id_cat_societe = cat_societe.id
    	JOIN Base.plancpt_societe
    		ON rsociete.idsociete = plancpt_societe.id_societe
    		JOIN Base.plancpt_lib
    			ON plancpt_lib.id = plancpt_societe.id_plancpt
    ORDER BY num_societe;

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 744
    Points
    52 744
    Billets dans le blog
    5
    Par défaut
    C'est mieux, mais pour la rendre lisible, vous auriez du utiliser des alias de table... la voici récrite :

    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
    SELECT PL.intitule AS Plan_comptable,
    	   CS.libelle AS categorie,
    	   RS.type_societe,
    	   RS.intitule AS intitule_societe,
    	   RS.num_societe
    FROM   Base.rsociete AS RS
    	   LEFT OUTER JOIN Base.asso_cat_societe AS ACS
    		    ON ACS.idsociete = RS.idsociete
    		    JOIN Base.cat_societe AS CS
    			     ON ACS.id_cat_societe = CS.id
    	   JOIN Base.plancpt_societe AS PS
    		    ON RS.idsociete = PS.id_societe
    		    JOIN Base.plancpt_lib AS PL
    			     ON PL.id = PS.id_plancpt
    ORDER BY num_societe;
    Vous avez d'ailleurs parfaitement indenté vos différentes branche de jointure et je vous en félicite ! (et croyez moi les félicitations dans mes écrits sont rarissimes !!!)

    maintenant ce que vous constatez c'est que dans votre clause FROM se dévoilent 2 branches de jointures distincte...
    Base.rsociete ... JOIN Base.asso_cat_societe ... JOIN Base.cat_societe (1ere branche)
    et
    Base.rsociete ... JOIN ... Base.plancpt_societe ... JOIN ... Base.plancpt (2e branche)

    Or que se passe t-il dans la première jointure de la première branche ?
    Faisant une jointure externe gauche, vous ramenez des NULL dans les colonnes de la table Base.asso_cat_societe pour les cas ou la jointure n'existe pas...
    mais dans la jointure suivante de Base.asso_cat_societe vers Base.cat_societe vous faites une jointure interne !!! Qui exige des valeurs non NULL. Ce qui annule de fait la jointure externe exprimée juste avant...

    Bref, et apprenez le par cœur... lorsque l'on commence une branche de jointure en externe, il y a toutes les chances qu'il faille la continuer TOUJOURS en jointure externe !!!

    Et votre requête s'écrit donc :

    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
    SELECT PL.intitule AS Plan_comptable,
    	   CS.libelle AS categorie,
    	   RS.type_societe,
    	   RS.intitule AS intitule_societe,
    	   RS.num_societe
    FROM   Base.rsociete AS RS
    	   LEFT OUTER JOIN Base.asso_cat_societe AS ACS
    		    ON ACS.idsociete = RS.idsociete
    		    LEFT OUTER JOIN Base.cat_societe AS CS
    			     ON ACS.id_cat_societe = CS.id
    	   JOIN Base.plancpt_societe AS PS
    		    ON RS.idsociete = PS.id_societe
    		    JOIN Base.plancpt_lib AS PL
    			     ON PL.id = PS.id_plancpt
    ORDER BY num_societe;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Merci beaucoup, ça fonctionne très bien et fait ce que je souhaite.


  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Bref, et apprenez le par cœur... lorsque l'on commence une branche de jointure en externe, il y a toutes les chances qu'il faille la continuer TOUJOURS en jointure externe !!!
    Pas nécessairement, ça dépend du modèle.
    Si entre ACS et CS on sait qu'il n'y a pas d'association de type (0,x), on peut très bien écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        SELECT PL.intitule           AS Plan_comptable
             , CS.libelle            AS categorie
             , RS.type_societe
             , RS.intitule           AS intitule_societe
             , RS.num_societe
          FROM Base.rsociete         AS RS
     LEFT JOIN Base.asso_cat_societe AS ACS
    INNER JOIN Base.cat_societe      AS CS ON CS.id         = ACS.id_cat_societe
                                           ON ACS.idsociete = RS.idsociete
    INNER JOIN Base.plancpt_societe  AS PS ON PS.id_societe = RS.idsociete
    INNER JOIN Base.plancpt_lib      AS PL ON PL.id         = PS.id_plancpt
      ORDER BY RS.num_societe;
    Il faut lire le from avec ces parenthèse pour bien comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          FROM Base.rsociete                 AS RS
     LEFT JOIN ( Base.asso_cat_societe       AS ACS
                 INNER JOIN Base.cat_societe AS CS ON CS.id         = ACS.id_cat_societe )
                                                   ON ACS.idsociete = RS.idsociete

  7. #7
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonsoir,

    Il peut en effet y avoir une catégorie de société sans qu'il y ait de société dedans.

    Mais la, le but est d'avoir la liste des sociétés qui ont ou n'ont pas de catégorie, ont ou n'ont pas de plan comptable,

    Cordialement,

    vandman

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

Discussions similaires

  1. [WD15] requête sql non exécutée ou incompléte
    Par yoonu dans le forum WinDev
    Réponses: 12
    Dernier message: 25/03/2013, 20h04
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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