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 :

Jointure sur la même table avec récupération des valeurs NULL


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : septembre 2005
    Messages : 192
    Points : 118
    Points
    118
    Par défaut Jointure sur la même table avec récupération des valeurs NULL
    Bonjour,

    J'ai un soucis pour écrire une requête faisant une jointure sur une même table.
    Voici le contenu de ma table d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +---------+----+---+
    | id_file | k  | v |
    +---------+----+---+
    |       1 | A1 | A |
    |       1 | B1 | B |
    |       1 | C1 | C |
    |       2 | A1 | D |
    |       2 | B1 | E |
    |       3 | B1 | F |
    |       3 | C1 | G |
    +---------+----+---+
    Récupération datas pour les fichiers ayant comme id_file 1 et 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        a.k k1, a.v v1,
        b.k k2, b.v v2
    FROM test a
        LEFT JOIN test b ON a.k = b.k AND b.id_file = 2
    WHERE a.id_file = 1
    ORDER BY a.k;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +----+----+------+------+
    | k1 | v1 | k2   | v2   |
    +----+----+------+------+
    | A1 | A  | A1   | D    |
    | B1 | B  | B1   | E    |
    | C1 | C  | null | null |
    +----+----+------+------+
    Cela fonctionne vu que je prends toutes les lignes de "b" mais je pense qu'il est possible de faire plus propre (et plus conforme ?)


    Récupération datas pour les fichiers ayant comme id_file 2 et 3
    Ici je ne vois pas trop comment tourner la requête pour obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +------+------+------+------+
    | k1   | v1   | k2   | v2   |
    +------+------+------+------+
    | A1   | D    | null | null |
    | B1   | E    | B1   | F    |
    | null | null | C1   | G    |
    +------+------+------+------+
    Une petite idée ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 721
    Points : 11 346
    Points
    11 346
    Par défaut
    Bonjour,
    Concernant la première requête, je ne vois pas ce qui "choque".

    Pour la deuxième, je partirai sur un FULL OUTER JOIN, qui semble tout à fait correspondre à ce que tu cherches.

    Tatayo.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : septembre 2005
    Messages : 192
    Points : 118
    Points
    118
    Par défaut
    Je viens de tester avec le FULL OUTER JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
        a.k k1, a.v v1,
        b.k k2, b.v v2
    FROM test a
        FULL OUTER JOIN test b ON a.k = b.k AND b.id_file = 3
    WHERE a.id_file = 2
    ORDER BY a.k;
     
     k1 | v1 | k2 | v2 
    ----+----+----+----
     A1 | D  |    | 
     B1 | E  | B1 | F
    Les 2 premières lignes sont ok par contre je n'arrive pas à choper la ligne "null | null | C1 | G"

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 721
    Points : 11 346
    Points
    11 346
    Par défaut
    C'est "normal", vu que tu as mis une condition sur la table a. Donc tu as transformé un FULL OUTER JOIN en LEFT JOIN.
    Il faut donc inclure les lignes non trouvées dans la table a:
    (pas testé, j'ai toujors un peu de mal avec les FULL OUTER JOIN)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
        a.k k1, a.v v1,
        b.k k2, b.v v2
    FROM test a
        FULL OUTER JOIN test b ON a.k = b.k AND b.id_file = 3
    WHERE isnull(a.id_file,2) = 2
    ORDER BY a.k;

    Sinon il existe une autre solution: faire une union de 2 requêtes LEFT OUTER JOIN, mais en inversant les deux tables dans les requête.
    Ou plus didactique, faire la requête sans filtre sir id_file, mais en ajoutant les colonnes if_file dans le SEECT.
    En fonction du résultat tu devrais voir comment filtrer le résultat.

    Tatayo.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : septembre 2005
    Messages : 192
    Points : 118
    Points
    118
    Par défaut
    Oui le coup des 2 requêtes c'est à tester. Je vais regarder dans ce sens.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : septembre 2005
    Messages : 192
    Points : 118
    Points
    118
    Par défaut
    Problème réglé de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT a.k k1, a.v v1, b.k k2, b.v v2
    FROM test a
        LEFT JOIN test b ON a.k = b.k AND b.id_file = 3
    WHERE a.id_file = 2
     
    UNION
     
    SELECT b.k k1, b.v v1, a.k k2, a.v v2
    FROM test a
        LEFT JOIN test b ON a.k = b.k AND b.id_file = 2
    WHERE a.id_file = 3;
    Merci à toi pour le coup de main

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

Discussions similaires

  1. Multi-jointures sur une même table et affichage des données
    Par Seishiro59 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/11/2017, 19h46
  2. Jointure sur un même table avec utilisation MIN/MAX
    Par Chips_ dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/12/2012, 15h29
  3. Réponses: 3
    Dernier message: 13/06/2007, 00h31

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