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 :

Optimisation de requetes, avec plusieurs jointures gauches, informations inexistantes


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Optimisation de requetes, avec plusieurs jointures gauches, informations inexistantes
    Bonjour,

    Je veux faire une requete qui me récupère l'ensemble des acteurs pour lesquels un informatiosn au moins est renseigné.
    Les informations recherchées sont toutes dans la table matable, sous la forme
    matable.type_donnee = type de données (par exemple CA2001)
    matable.valeur_donnee =) valeur de la donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE matable
    (
      ACTID       NUMBER(7)                         NOT NULL,
      type_donnee VARCHAR2(15)                      NOT NULL,
      valeur_donnee VARCHAR2(50)
    )
    Voici la requête à laquelle j'aboutis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT a.actid AS actid, t_donnee1.valeur_donnee AS ma_donnee1,
      t_donnee2.valeur_donnee AS ma_donnee2
      FROM acteur a, matable t_donnee1, matable t_donnee2
     WHERE t_donnee1.actid(+) = a.actid
       AND t_donnee2.actid(+) = a.actid
       AND t_donnee1.type_donnee(+) = 'typedonnee1'
       AND t_donnee2.type_donnee(+) = 'typedonnee2'
    le problème, c'est que je me retrouve avec énormément d'enregistrements pour lesquels je n'ai aucune information.
    Existe-t-il une solution élégante pour en récupérer que les enregistrements significatifs (c'est-à-dire pour lesquels on a au moins une information) ?

    (en sachant qu'il y a en réalité une demi douzaine de données que je veux récupérer de la sorte, et qu'il y a près de 30000 enregistrements dans la table acteur, et très peu d'information dans la table matable)

    merci d'avance.
    Pour info, j'utilise Oracle - s'il existe des astuces propres à Oracle.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.actid AS actid, d1.valeur_donnee AS ma_donnee1,
      d2.valeur_donnee AS ma_donnee2
      FROM acteur a
          LEFT JOIN matable d1
              ON d1.actid = a.actid AND d1.type_donnee = 'typedonnee1'
          LEFT JOIN  matable d2
              ON d2.actid = a.actid AND d2.type_donnee = 'typedonnee2'
     WHERE d1.actid IS NOT NULL OR d2.actid IS NOT NULL
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Swoög
    pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.actid AS actid, d1.valeur_donnee AS ma_donnee1,
      d2.valeur_donnee AS ma_donnee2
      FROM acteur a
          LEFT JOIN matable d1
              ON d1.actid = a.actid AND d1.type_donnee = 'typedonnee1'
          LEFT JOIN  matable d2
              ON d2.actid = a.actid AND d2.type_donnee = 'typedonnee2'
     WHERE d1.actid IS NOT NULL OR d2.actid IS NOT NULL
    c'est pas mal. Au début j'avais pensé à faire le test de nullité sur chacune de mes variables, mais je trouvais ça peu élégant. Ca me convient mieux.
    En réalité, je me demandais s'il existait un type de jointure qui pouvait gérer ce cas...

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    dans le cas présent, il n'y a pas de jointure particulières, parce qu'en fait, tu fais deux jointures... donc tu ne peux pas sélectionner de manière sûr...

    pour plus d'infos sur les jointures, voir le tuto de SQLpro qui est référencé sur mon site
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Imaginons maintenant que :
    type_données ait pour domaine de valeur CA2001, CA2002, CACONS2001, CACONS2002, et que je veuille récupérer les derniers CA et CACONSO renseignés pour chacun des acteurs en base.
    pour récupérer chacun séparément, je fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    select actid, valeur_donnee, max(substr(type_donnee),3 ou 7)) 
    from matable 
    group by actid, valeur_donnee.
    Comment faire pour faire les deux opérations en une seule requete ?

    Voici un exemple de donnée dans matable :
    actid;type_donnee;valeur_donnee
    1;CA2001;10000000
    1;CA2002;5000000
    2;CACONS2001;1000000
    3;CACONS2002;5000000
    3;CACONS2001;6000000
    4;CACONS2001;650000
    4;CA2002;680000
    4;CACONS2002;65000
    ...

    Et je veux récupérer:
    1;CA2002;xxx
    2;CACONS2001;xxx
    3;CACONS2002;xxx
    4;CA2002;xxx
    4;CACONS2002;xxx

    Quelqu'un aurait-il une idée ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 09/02/2010, 20h08
  2. Requete SQL avec plusieurs jointures
    Par Esil2008 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/09/2009, 12h51
  3. Optimisation requete SQL ,plusieurs jointure ?
    Par mamiberkof dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/02/2008, 16h39
  4. requete avec plusieurs jointure
    Par robert_trudel dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/02/2007, 10h35
  5. requete avec 2 jointures
    Par bissy88 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/04/2004, 13h52

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