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 :

Dédoublement de certaines lignes / jointure externe (LEFT)


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Dédoublement de certaines lignes / jointure externe (LEFT)
    Bonjour,

    Je réalise une requête qui doit me ramener des informations sur des dossiers, en y ajoutant des informations en provenance de tables liées en N/N (1 dossier peut pointer 1 ou plusieurs "motifs", et 1 motif peut être invoqué par plusieurs dossiers). Afin de conserver 1 seule ligne par dossier, j'agrège dans mon select les résultats en provenance (array_agg). Jusqu'ici, tout va bien.

    Mais les choses se gâtent quand j'ajoute une autre jointure (toujours LEFT) sur une table qui contient des infos liées à 1 seul de ces motifs (le motif "2"), et une colonne pour les afficher dans mon select. du coup, quand mon dossier invoque les motifs 1 et 3, tout va bien, mais quand il invoque les motifs 1 et 2, je me retrouve avec 2 lignes pour ce même dossier : une pour le motif 1, sans infos ajoutée, et 1 pour le motif 2 qui va contenir mes infos en +.
    Ce que je voudrais, c'est toujours conserver 1 seule ligne par dossier, qu'il y ait ou non des infos à rajouter pour le motif 2.

    Ma requête ressemble à ça (simplifiée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT dossier.dos_id AS Numéro_interne,
    array_to_string(array_agg(DISTINCT lmr.lmot_libelle),E'\n - ') Motif_Dossier,
    CASE WHEN mot2_isoption IS true THEN 'oui' ELSE 'non' END AS Option_motif_2,
    dossier.dos_adresse
    FROM dossier
    LEFT JOIN motifsdossier mr ON dossier.dos_id = mr.dos_id INNER JOIN motif lmr ON mr.lmot_id = lmr.lmot_id
    LEFT JOIN repmotifdeux ON (mr.motd_id = motifdeux.motd_id AND mr.lmot_id = 2)
    WHERE dossier.departement_id= '1'
    GROUP BY dossier.dos_id, mot2_isoption
    Merci de votre aide !
    Bonne journée

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je n'ai pas bien compris ce que vous vouliez faire, et un petit jeu d'essai plus résultat attendu serait le bienvenu.
    Par ailleurs, il me semble que votre jointure interne sur motif annule l'effet de la jointure externe sur motifsdossier. Il faudrait donc imbriquer vos jointures.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Voici un petit exemple de ce que j'aimerais obtenir, sur 3 dossiers, à partir de ce genre de requête :

    Numero_interne Motifs_dossier Option_motif_2
    15 Motif 1 - Motif 3 non
    22 Motif 2 - Motif 3 oui
    26 Motif 1 - Motif 2 non

    Le problème est que pour cet exemple de données, actuellement, j'obtiens 5 lignes au lieu de 3 : 1 ligne pour le dossier 15, 2 lignes pour le dossier 22, (une pour le motif 2 et une pour le motif 3), et 2 lignes pour le dossier 26 (1 pour chaque motif). Ceci vient de l'ajout de la jointure qui donne une information supplémentaire au sujet du motif 2 uniquement.
    Pour la jointure interne, cela semble fonctionner dans la mesure où la table Motif est une table de référence (donc aucune ligne vide obtenue dans le croisement des 2). Mais vous avez raison, une jointure externe marche tout aussi bien.

    Merci

Discussions similaires

  1. Problème jointure externe (LEFT JOIN et pas (+))
    Par tatayoyo dans le forum ODI (ex-Sunopsis)
    Réponses: 1
    Dernier message: 12/05/2011, 13h15
  2. DB2 LUW jointure externe avec "des lignes"
    Par jadey dans le forum DB2
    Réponses: 5
    Dernier message: 15/10/2010, 09h43
  3. Réponses: 4
    Dernier message: 31/05/2010, 21h50
  4. jointure externe qui retourne 1 ligne par enregistrement
    Par goony dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/05/2006, 17h51
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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