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

Requêtes PostgreSQL Discussion :

Problème requête PostgreSQL


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Problème requête PostgreSQL
    Bonjour à tous,

    J'ai un problème sur une requête avec plusieurs conditions.

    Voici mes 3 tables :

    Rapport

    Num_rapp nom_rapp
    1 Stage IUT
    2 Stage Thalès
    3 Projet stéra
    4 Projet rivière

    Mot_cle

    Num_mc Nom_mc
    1 Environnement
    2 Public
    3 Privé
    4 Développement
    5 WEB


    Illuster_par

    Num_rapp Num_mc
    1 2
    1 5
    2 3
    3 3
    4 4
    4 2


    Je veux créer une requête qui m'affiche par exemple les rapports qui utilisent les mot clé "Public" et "WEB"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Nom_rapp
    from Rapport, illustrer_par
    where Rapport.Num_rapp=illustrer_par.Num_rapp and Num_mc = 2 and Num_mc = 5;
    Il devrait m'afficher "STAGE IUT" car il n'y a que ce rapport qui les mot clé 2 et 5 associés.

    Or il ne m'affiche rien du tout ... aucun résultat ..

    Est-ce que quelqu'un a une explication ?

    Merci !!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Est-ce que tu trouves UNE ligne de la table mot_cle qui répond à ta condition Num_mc = 2 AND Num_mc = 5 ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ce que vous voulez faire c'est une division relationnelle

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Je ne vois toujours pas comment faire avec une division rationnelle ...
    Une petite démo ?

    merci !

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    si STAGE_IUT est aussi associé a Développement en plus des deux autres, faut-il le sélectionner quand même ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Si stage IUT est associé à développement dans la table illustrer_par et que dans la requête je veux tous les rapport qui ont comme mot clé WEB, développement et Public, alors oui, il faut le sélectionner. Mais si dans ma requête je ne veux afficher que les rapports associés à web et public, alors non.

    Tu comprends mon raisonnement ?

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    oui, dans ce cas pas d'autre solution que la réponse de skuatamad.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    est ce que vous pourriez me montrer pour cette requête avec la technique de la division relationnelle ?
    Je n'arrive pas à la faire

    Merci !

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Montre-nous où tu en es arrivé, ce sera plus facile pour faire évoluer ta requête.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT Nom_rapp, Num_rapp
    FROM Rapport AS ETP1
    WHERE NOT EXISTS
       (SELECT Num_mc
        FROM Mot_cle
        WHERE NOT EXISTS
           (SELECT Num_mc
            FROM illustrer_par AS ETP2
            WHERE ETP1.Num_rapp = ETP2.Num_rapp
            AND num_mc = 2 and num_mc = 5))

    Voila ma requête mais ça ne marche pas

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Je ne regarde pas plus loin que la ligne 10 de ta requête pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            AND num_mc = 2 AND num_mc = 5))
    Penses-tu que cette condition puisse être vérifiée à un moment quelconque ?
    La colonne num_mc ne peut contenir deux valeurs différentes pour la même ligne
    Elle peut éventuellement accueillir soit l'une, soit l'autre.
    Que penserais-tu de commencer en faisant cette légère modification.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            AND (num_mc = 2 OR num_mc = 5)))
    Edit: j'avais déjà soulevé le problème hier soir !
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Oui mais je ne vois vraiment pas comment faire ... sans cela ...

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je trouve que la version agrégation est plus simple, voici 2 approches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select i1.num_rapp
      from illustrer_par i1
     where i1.Num_mc in (2,5)
     group by i1.num_rapp
    having count(*) = 2 -- Correspond au nombre de Num_mc dans la liste
       and count(*) = (select count(*) from illustrer_par i2 where i2.num_rapp = i1.num_rapp)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select num_rapp
         , sum(case when Num_mc in (2,5) then 1 end)
         , count(*)
      from illustrer_par
     group by num_rapp
    having sum(case when Num_mc in (2,5) then 1 end) = count(*)
       and count(*) = 2 -- Correspond au nombre de Num_mc dans la liste

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    skuatamad, je crains que ta requête ne corresponde pas à ce que zindora réclame.
    Il lui faut impérativement la condition num_mc = 2 AND num_mc = 5, sinon il ne sait pas comment faire...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci pour l'éclaircissement =)
    Mais je ne comprends pas ton Having count(*) = 2

  16. #16
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Comme Alain te l'explique depuis hier, on ne peut pas écrire une condition telle que num_mc=5 and num_mc=2.
    Ca revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Pour toutes les lignes de la table
        Si 5 = 2 alors
          renvoyer la ligne
        sinon 
          rien on passe à la suivante
        fin si
    fin pour
    Et avec un tel code, on obtient :
    Or il ne m'affiche rien du tout ... aucun résultat ..
    Du coup il faut faire autrement.

    On sélectionne les lignes telles que num_mc=5 OU num_mc=2.
    Mais ça n'est pas suffisant pour le besoin. Donc on rajoute une condition :
    count(*)=2 <=> le num_rapp doit être associé impérativement aux 2 num_mc sélectionnés dans le IN (count(*)=3 s'il y a 3 num_mc dans la liste).

    Ca n'est pas encore suffisant car :
    Si stage IUT est associé à développement dans la table illustrer_par et que dans la requête je veux tous les rapport qui ont comme mot clé WEB, développement et Public, alors oui, il faut le sélectionner. Mais si dans ma requête je ne veux afficher que les rapports associés à web et public, alors non.
    On rajoute donc l'autre condition dans le HAVING qui s'écrit en fonction de la solution choisie.

    Avec la requête à base d'EXISTS, c'est pareil, il faut utiliser OR (IN) et pas AND.

    Pour mieux comprendre une requête, il faut l'exécuter partie par partie en supprimant des clauses pour comprendre les différentes étapes de restriction.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse claire et précise ! ça marche nickel !

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'ai trouvé une autre solution si ça intéresse quelqu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Nom_rapp
    FROM Rapport
    WHERE Num_rapp in
    ((SELECT Num_rapp FROM illustrer_par WHERE num_mc=2)
    INTERSECT
    (SELECT Num_rapp FROM illustrer_par WHERE num_mc=5))

  19. #19
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Oui, on peut aussi joindre plusieurs fois la table sur elle même avec les différents filtres, ce qui revient un peu au même. Il y a plein de possibilités.

    L'avantage de l'approche avec GROUP BY c'est qu'elle ne touche la table qu'une seule fois, en fonction des volumes, répartition de données, critères de filtres ça peut être plus performant

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

Discussions similaires

  1. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  2. erreur3073 Problème requête
    Par amel123456789 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2004, 10h15
  3. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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