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 :

Jointures "en parallèles"


Sujet :

Langage SQL

  1. #1
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut Jointures "en parallèles"
    Bonjour !

    J'ai des circuits (électriques) (table CIRCUIT), auxquels sont rattachés des lampes (LAMPE) pour lesquelles on connaît la puissance, et d'autres appareils (AUTRE), dont on connaît également la puissance. Je voudrais calculer la puissance totale rattachée à un circuit, style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CIRCUIT.ID_CIRCUIT,
    SUM (LAMPE.PUISSANCE) + SUM (AUTRE.PUISSANCE) AS PUISSANCE_TOTALE
    FROM CIRCUIT
    JOIN LAMPE ON LAMPE.ID_CIRCUIT = CIRCUIT.ID_CIRCUIT
    JOIN AUTRE ON AUTRE.ID_CIRCUIT = CIRCUIT.ID_CIRCUIT
    GROUP BY CIRCUIT.ID_CIRCUIT
    Le problème est que si j'utilise des jointures internes, les circuits qui n'ont que des lampes ou que des autres sont squeezés, bien sûr, et que si j'utilise des jointures externes, des valeurs se retrouvent dupliquées.

    Voici donc ma question : sachant que je suis sous Firebird 1.5, qui n'accepte ni les tables temporaires, ni les SELECT dans le FROM, y a-t-il un moyen d'obtenir le résultat en une seule requête ?
    Roland

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Points : 616
    Points
    616
    Par défaut
    Bonjour,
    Juste une question, il n'est pas possible de Faire une jointure Externe et un Select Distinct??
    Je ne connais pas Firebird ... mais bon ca me semble jouable ...

    Bonne chance
    Je pense volontiers à penser aux choses auxquelles je pense que les autres ne penseront pas

  3. #3
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Merci de ta réponse !

    Mais DISTINCT sur quoi ? Il me semble que le seul endroit où le mettre serait à CIRCUIT.ID_CIRCUIT, et là, l'unicité est déjà assurée par le GROUP BY, non ?

    Le problème est que, si j'ai sur un circuit 2 lampes de 60 et 100 W et un "autre" de 200 W, la jointure externe me renvoie deux lignes du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID  LAMPES AUTRES
    1      50        200
    1      100      200
    ce qui évidemment, en sommant, ne donne pas le bon résultat, mais je n'ai pas trouvé de biais pour éviter ça
    Roland

  4. #4
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    Citation Envoyé par rsc Voir le message
    sachant que je suis sous Firebird 1.5, qui n'accepte ni les tables temporaires, ni les SELECT dans le FROM, y a-t-il un moyen d'obtenir le résultat en une seule requête ?
    Intéressant ! Le fait de ne pas pouvoir passer par une simple table dérivée (SELECT dans le FROM) pousse à imaginer d'autres solutions !
    Pourquoi ne pas passer par des sous-requêtes dans la clause SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ID_CIRCUIT, 
    	COALESCE((
    		SELECT SUM(PUISSANCE)
    		FROM LAMPE
    		WHERE ID_CIRCUIT = C.ID_CIRCUIT),0) 
    	+ COALESCE((
    		SELECT SUM(PUISSANCE)
    		FROM AUTRE
    		WHERE ID_CIRCUIT = C.ID_CIRCUIT),0) AS PUISSANCE_TOTALE
    FROM CIRCUIT AS C;

  5. #5
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Oui bien sûr, j'aurais dû y penser !
    Roland

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

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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