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

Langage SQL Discussion :

Jointure avec tables différentes selon les cas


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut Jointure avec tables différentes selon les cas
    Bonjour,

    je dois faire des requêtes SQL sur une BDD DB2 pas du tout normalisée...youpi...
    J'ai 3 tables :
    FACTURE (ID_facture)
    PRIX_FORFAIT (ID_facture, ID_forfait, coef_forfait, montant_forfait, ID_detail)
    PRIX_DETAIL (ID_detail, prix_detail)
    Très simplement je dois récupérer mes factures avec l'ID du prix, qui est dans le champ ID_forfait, sauf quand le champ coef_forfait est différent de zéro, auquel cas il faut que je récupère les lignes de PRIX_DETAIL (ID_detail donc).
    Une facture peut avoir un prix forfaitaire, ou une combinaison de lignes de PRIX_DETAIL.

    Ma requête SQL (encore une fois très simplifiée par rapport à ma requête réelle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select f.ID_facture,
    CASE
    	WHEN pf.coef_forfait=0 then pf.ID_forfait
    	ELSE pd.ID_detail
    END as ID_prix
    from FACTURE f 
    inner join PRIX_FORFAIT pf on f.ID_facture = pf.ID_facture
    left outer join PRIX_detail pd on pf.ID_detail = pd.ID_detail
    Cette requête me fait systématiquement une jointure avec PRIX_detail même quand coef_forfait est à zéro.

    Une petite précision : je ne peux bien sûr pas intervenir sur le modèle de la BDD !

    Comment fait-on ?
    Cordialement.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    Je pense qu'il te faut un deuxième WHEN à la place du ELSE : WHEN pf.coef_forfait>0 then pd.ID_detail.
    Ensuite, je pense qu'il te faut créer une variable dans laquelle tu mettras ID_prix_forfait ou ID_prix_détail selon le when qui aura été lu.

    Je n'ai pas testé mais c'est ce que je ferais.
    OS : LinuxMint 20

  3. #3
    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,

    vous pouvez ajouter la condition sur le coef dans la jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
        f.ID_facture,
        COALESCE(pd.ID_detail, pf.ID_forfait) AS ID_prix
    FROM FACTURE f 
    INNER JOIN PRIX_FORFAIT pf 
        ON f.ID_facture = pf.ID_facture
    LEFT OUTER JOIN PRIX_detail pd 
        ON pf.ID_detail = pd.ID_detail
        AND pf.coef_forfait<>0

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    mon conseil est ptêt à côté de la question, mais tu devrais définir une vue propre et travailler sur cette vue plutôt que sur un puzzle immonde.

    Non?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM   FACTURE AS F
           INNER JOIN PRIX_FORFAIT AS PF
    	         ON F.ID_facture = PF.ID_facture
    	   LEFT OUTER JOIN PRIX_DETAIL AS PD
    	        ON PF.coef_forfait <> 0 AND PF.ID_detail = PD.ID_detail
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Super, ça fonctionne nickel !
    Merci beaucoup
    Cordialement.

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

Discussions similaires

  1. Une même table mais encodage différent selon les colonnes
    Par mathieu_r dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 21/09/2012, 16h38
  2. Réponses: 0
    Dernier message: 07/05/2012, 18h13
  3. Réponses: 0
    Dernier message: 23/07/2009, 15h45
  4. Réponses: 2
    Dernier message: 24/01/2006, 12h43
  5. tailles d'input différentes selon les postes (?)
    Par mch_27 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/10/2005, 11h21

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