Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    juin 2005
    Messages
    684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : juin 2005
    Messages : 684
    Points : 446
    Points
    446

    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    Structure:
    TableA
    ID (serial clé primaire)
    Titre (text)
     
    Données:
    1 , 'produit1'
    2 , 'produit2'
    Code :
    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 éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    juin 2005
    Messages
    684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : juin 2005
    Messages : 684
    Points : 446
    Points
    446

    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 :
    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 Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 625
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 5 625
    Points : 13 670
    Points
    13 670

    Par défaut

    Connais-tu les jointures externes ?
    Code :
    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 éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    juin 2005
    Messages
    684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : juin 2005
    Messages : 684
    Points : 446
    Points
    446

    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 :
    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

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 6 867
    Points : 14 245
    Points
    14 245

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •