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 :

[Oracle] jointures avec une somme sur deux champs


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [Oracle] jointures avec une somme sur deux champs
    Bonjour a tous

    Cela fait un petit moment que j'ai du mal avec une requete.
    Je suis sous Oracle.
    J'ai deux tables

    table country qui liste tous les pays
    ------------
    Country
    ------------
    - code
    - name
    - area

    et la table borders qui liste toutes les frontieres entre les pays
    ------------
    Borders
    ------------
    - country1
    - country2

    exemple : F, D pour la frontiere france-allemagne

    La question :
    Afficher la liste des pays avec pour chacun la somme des surfaces de leurs pays voisins
    (si un pays na pas de voisin il est quand meme affiche avec 0)


    J'ai fait un premier essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT pays.name AS "Pays", SUM(pays2.area) AS "Somme surfaces"
    	FROM country pays1
    		INNER JOIN borders
        	ON borders.country1 = pays1.code
    		INNER JOIN country pays2
        	ON borders.country2 = pays2.code
    		GROUP BY land1.name
    Je croyais que cela marchait mais en fait non.
    Le probleme cest que dans la liste des frontieres ne contient pas de doublons cest a dire que l'on a par exemple
    ES - F
    ES - POR
    F - CH
    un pays peut donc etre dans la colonne country1 et dans country2 a la fois

    Si quelqun voit comment faire
    Merci de bien vouloir m'eclairer

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par guggus
    Je croyais que cela marchait mais en fait non.
    Salut,

    Tu as bien exposé ton problème ... à ceci près que l'on ne sait pas ce qui ne fonctionne pas ? As-tu un message d'erreur ou bien un résultat incorrect ?

    Ta requête m'a paru correcte à vue d'oeil, sauf qu'elle fait des jointures internes, et pas externes, ce qui ne te ramènera aucune ligne pour les pays sans voisins : cf le cours suivant : Les jointures, ou comment interroger plusieurs tables
    et en particulier : 2.3. Les jointures externes
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Le résultat que j'obtient est imcomplet et faux.
    Il manque des pays : ceux qui en fait sont uniquement inscris a chaque fois dans la colonne country2 dans la table border
    Et ceux qui y sont au moins une fois on un resultat faux.

    Cela est du au fait que la frontiere est ainsi
    country1 - country2

    et que dans ma premiere requete je fais la jointure sur country1 donc toutes les fois ou le pays est a droite dans la liason la ligne n'est pas prise en compte.Cela car les frontieres ne sont ecrites qune seule fois
    ex: D - F pour allemagne - france est dans la table mais pas F - D.

    j'ai pensé avec un OR
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LEFT OUTER JOIN ON pays1.code = borders.country1
    OR pays1.code = borders.country2
    Mais apres si je fais la sonne sur pays1.area ca va me donner la somme de X fois la surface du pays, et non pas celle de ses voisins.

    Je ne vois pas trop comment faire, principalement si je dois sommer une fois sur la surface du pays lié a country1 et une fois a country2

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Mouais ... c'est plus un problème de modélisation qu'un problème SQL, la table Borders n'est pas "symétrique", tu aurais du gérer une table de frontière, en rattachant les pays aux frontières via une table de liens intermédiaire.

    Bref, si tu as les moyens de modifier ton shéma, je te conseille de le faire

    Sinon, je pense que tu ne peux t'en tirer avec une jointure classique, mais un test sur Borders avec un EXISTS devrait te permettre de solutionner ton problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT pays1.name AS Pays, 
           SUM(pays2.area) AS Somme surfaces
      FROM country pays1 CROSS JOIN country pays2
     WHERE EXISTS 
          (SELECT *
             FROM Borders
            WHERE (borders.country1 = pays1.code AND borders.country2 = pays2.code)
               OR (borders.country1 = pays2.code AND borders.country2 = pays1.code));
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

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

Discussions similaires

  1. Update d'un champ avec une condition sur ce champ
    Par CALI31 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 13/11/2013, 16h28
  2. [Débutant] Effectuer une somme sur un champ de mon DataSource
    Par miniil dans le forum ASP.NET
    Réponses: 4
    Dernier message: 05/09/2013, 12h08
  3. Réponses: 5
    Dernier message: 10/06/2009, 11h01
  4. peut on filtrer une table sur deux champs
    Par lila23 dans le forum Débuter
    Réponses: 3
    Dernier message: 20/04/2009, 17h48
  5. Une Recherche sur deux champs
    Par souminet dans le forum Débuter
    Réponses: 8
    Dernier message: 04/11/2008, 13h56

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