Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/07/2012, 16h15   #1
giova_fr
Membre éprouvé
 
Homme
Développeur .NET
Inscription : juin 2005
Messages : 674
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France

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

Informations forums :
Inscription : juin 2005
Messages : 674
Points : 451
Points : 451
Envoyer un message via ICQ à giova_fr
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?
giova_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2012, 18h19   #2
giova_fr
Membre éprouvé
 
Homme
Développeur .NET
Inscription : juin 2005
Messages : 674
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France

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

Informations forums :
Inscription : juin 2005
Messages : 674
Points : 451
Points : 451
Envoyer un message via ICQ à giova_fr
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
giova_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2012, 10h38   #3
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 936
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
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 : 4 936
Points : 11 922
Points : 11 922
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2012, 14h07   #4
giova_fr
Membre éprouvé
 
Homme
Développeur .NET
Inscription : juin 2005
Messages : 674
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France

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

Informations forums :
Inscription : juin 2005
Messages : 674
Points : 451
Points : 451
Envoyer un message via ICQ à giova_fr
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;
giova_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2012, 18h08   #5
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Î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 278
Points : 13 460
Points : 13 460
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h10.


 
 
 
 
Partenaires

Hébergement Web