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 :

Opérateur de comparaison


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué

    Profil pro
    Consultant Business Intelligence
    Inscrit en
    Novembre 2005
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant Business Intelligence

    Informations forums :
    Inscription : Novembre 2005
    Messages : 284
    Points : 186
    Points
    186
    Par défaut Opérateur de comparaison
    Bonjour,

    J'ai une question toute simple je fais une requête qui permet de voir qu'une personne a eu un entretien, étant donné la BdD mal conçue l'id de la personne est "harcodée":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.collab_id = 236)
    Dans ce cas, ça fonctionne parfaitement par contre, si je cherche d'autre personne en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.collab_id != 236)
     
    client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.collab_id <> 236)
     
    client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.collab_id < 236)
    l'id 236 n'est jamais exclus

    mais si je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.collab_id > 236)
    J'ai aucune ligne qui ressort, ce qui est juste.

    Est-ce que quelqu'un a une idée?

    Merci d'avance.

  2. #2
    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
    Il faudrait voir la requête complète, notamment le type de jointure.

  3. #3
    Membre habitué

    Profil pro
    Consultant Business Intelligence
    Inscrit en
    Novembre 2005
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant Business Intelligence

    Informations forums :
    Inscription : Novembre 2005
    Messages : 284
    Points : 186
    Points
    186
    Par défaut
    Oui Effectivement :
    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
     
    SELECT
    d."id" AS "did dossier client",
    e."id" AS "eid dossier entretient",
    "p"."id" AS "peid prestation",
    "p".prestation_name,
    r.collab_id
    FROM
      client.cli_dossier AS d
    INNER JOIN 
      client.cli_dossier_prestation_rel AS r ON (r.dossier_id = d."id")
    INNER JOIN
      client.cli_prestation AS p ON (p."id" = r.prestation_id AND p."id"=5) 
    INNER JOIN 
      -- client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.mode_id = 1) 
      --client.cli_dossier_entretien AS e ON (e.dossier_id = d."id" AND e.mode_id = 1 AND r.collab_id != 236) 
    WHERE
      e.entretien_date BETWEEN '2015-01-01' AND '2015-07-31' AND r.collab_id != 236
    Si je fais la condition à la fin de la requête ça fonctionne est-ce ma jointure qui est fausse? Ou la conception de la BdD mauvaise...

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Si vous cherchez à savoir si une personne a eu ou non un entretien, il faut alors faire une jointure de type "outer" vers la table des entretiens
    Une jointure inner ne construit que l'intersection des tables jointes, donc les éléments présents à la fois dans les 2 tables

    Voici une requete qui affiche les éléments pour l'individu 236, qu'il ait eu ou non un entretien :

    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 dos.id AS "did dossier client",
           ent.id AS "eid dossier entretien",
           prs.id AS "peid prestation",
           prs.prestation_name,
           rel.collab_id
    FROM  client.cli_dossier 
       AS dos
    INNER JOIN client.cli_dossier_prestation_rel 
       AS rel
       ON rel.dossier_id = dos.id
    INNER JOIN client.cli_prestation 
       AS prs
       ON prs.id = rel.prestation_id 
    LEFT OUTER JOIN client.cli_dossier_entretien 
      AS ent 
      ON ent.dossier_id = dos.id 
    WHERE rel.collab_id = 236
      AND prs.id = 5 
      AND (ent.mode_id = 1   OR  ent.mode_id is null)
      AND (    ent.entretien_date BETWEEN '2015-01-01' AND '2015-07-31' 
           OR  ent.entretien_date is null)
    Modifs :

    - j'ai remplacé l'inner join par un outer join pour la table entretien
    - j'ai ajouté un test de nullité sur les colonnes de la table d'entretien, puisque l'absence d'entretien est possible
    - j'ai déplacé les critères de filtrage dans le WHERE, pour ne conserver que ceux de jointure dans les ON (prs.id et ent.mode)
    - j'ai supprimé les guillemets inutiles (je trouve que ca facilite la lecture)
    - j'ai mis des alias un peu plus parlants
    - j'ai supprimé le "T" à la fin d'entretien

    Si la personne n'a pas eu d'entretien, alors la colonne dossier d'entretien affichera "null"

  5. #5
    Membre habitué

    Profil pro
    Consultant Business Intelligence
    Inscrit en
    Novembre 2005
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant Business Intelligence

    Informations forums :
    Inscription : Novembre 2005
    Messages : 284
    Points : 186
    Points
    186
    Par défaut
    Bonsoir, bonne nuit,

    Je vous remercie de la réponse, je ferais un test et je vous tiens au courant demain mais appartement, le métier c'est trompé depuis le début...environ 2 ans, l'id de l'employé ne dois pas être filtré tous les employés peuvent avoir ce type d'entretien selon un contrat que le métier a vérifier aujourd'hui....

    Merci encore.

Discussions similaires

  1. PB d'opérateur de comparaison
    Par fxleo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/11/2006, 16h19
  2. LIKE et opérateurs de comparaison
    Par celeamas dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/10/2006, 14h01
  3. Pb avec l'opérateur de comparaison IN
    Par petitnuage dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 16h13
  4. implémentation des opérateurs de comparaison
    Par niko8181 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/04/2005, 11h58
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

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