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 :

Peut on faire une jointure "conditionnelle"?


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut Peut on faire une jointure "conditionnelle"?
    Bonjour.

    Tout d'abord, pardonnez moi si je n'emplois pas les bon termes, le SQL n'est pas ma langue native

    Je souhaite créer une vue reposant sur 2 tables. Je veux qu'elle liste toutes les lignes de la table A et éventuellement qu'elle remplisse une colonne si elle trouve des correspondances avec la table B.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Structure:
    TableA
    ID (serial clé primaire)
    Titre (text)
     
    Données:
    1 , 'produit1'
    2 , 'produit2'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Structure:
    TableB
    ID (serial clé primaire)
    tableAid (integer, clé externe = TableA.ID , contrainte unique sur cette colonne)
    commentaire(text)
     
    Données:
    1 , 2 , 'c\'est le produit 1'
    Je souhaite donc avoir une vue qui représente toutes les lignes de la tableA de la facon suivante :

    TableA.ID,TableA.titre,TableB.titre

    Ca me donnerait ceci :

    1 , 'produit 1' , NULL
    2 , 'produit 2' , 'c\'est le produit 2'

    Est ce possible de faire ceci svp?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    J'ai fini par trouver merci

    Il faut utiliser CASE

    Par rapport à l'exemple que je donnais, ça donne à peu près ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
       TableA.ID,
       TableA.titre,
       CASE 
              WHEN TableA.ID IN (SELECT tableAid  FROM TableB)
                   THEN TableB.titre
                   ELSE NULL
       END AS "Commentaire"
    FROM TableA,TableB

  3. #3
    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 789
    Points
    30 789
    Par défaut
    Connais-tu les jointures externes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  TableA.ID
        ,   TableA.titre
        ,   TableB.titre  AS "Commentaire"
    FROM    TableA
        LEFT JOIN
            TableB
            ON  TableA.ID = TableB.tableAid
    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.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Merci pour cette précision, car j'allais justement réécrire ici pour dire que ma solution fonctionnait mal.

    Au fur et a mesure que mes tables se remplissaient j'obtenais trop de résultat :
    nombre de lignes de la table A * nombre de lignes de la table B

    Le LEFT JOIN a résolu mon problème.

    Par contre ma requette finale repose sur 3 tables, et du coup ma requette est assez lourde, décidément DBA est un job qui ne s'improvise pas !

    ma requette donne quelque chose comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Select 
       query1.ID,
       query2.titre,
       infos.details
    FROM 
         (Select ... table A Left Join Table B ...) as query1
             Left Join , (Select ... ) as query 2,
             infos
    WHERE infos.ID = query2.infoID;

  5. #5
    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 giova_fr Voir le message
    Par contre ma requette finale repose sur 3 tables, et du coup ma requette est assez lourde, décidément DBA est un job qui ne s'improvise pas !
    C'est vrai, mais DBA ce n'est pas du tout ça, il va falloir approfondir votre culture informatique.

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

Discussions similaires

  1. Peut-on faire une validation conditionnelle ?
    Par chriscoolletoubibe dans le forum Struts 2
    Réponses: 2
    Dernier message: 06/09/2007, 08h22
  2. Comment faire une jointure ?
    Par Terminator dans le forum Langage SQL
    Réponses: 12
    Dernier message: 16/10/2005, 13h26
  3. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10

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