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

Développement SQL Server Discussion :

Jointure LEFT JOIN avec aggrégation sur plusieurs tables en une seule requête [2016]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Jointure LEFT JOIN avec aggrégation sur plusieurs tables en une seule requête
    Bonjour,

    J'ai un souci d'optimisation (et de correction je pense) d'une requête assez basique à priori de jointure de 6 tables avec aggrégation de 100 variables environ, avec pour l'instant le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t0.ID, SUM(t1.var11), SUM(t1.var12), SUM(t1.var13), SUM(t2.var21), ... , SUM(t6.var64)
    INTO tabResult
    FROM (((((t0
    LEFT JOIN t1 ON t0.ID=t1.ID)
    LEFT JOIN t2 ON t0.ID=t2.ID)
    LEFT JOIN t3 ON t0.ID=t3.ID)
    LEFT JOIN t4 ON t0.ID=t4.ID)
    LEFT JOIN t5 ON t0.ID=t5.ID)
    LEFT JOIN t6 ON t0.ID=t6.ID
    GROUP BY t0.ID
    Ma table t0 comporte près de 3000 lignes, et mes tables t1 à t6 près de 40000 lignes. Ce que je souhaite est aggréger à partir de ces tables t1 à t6 près de 100 variables "varxx", sur la clé de jointure ID présente dans t0 et dans chacune des tables t1 à t6.
    Lorsque je décompose cette requête en 6 requêtes différentes (création d'une table résultat intermédiaire 1 avec les variables de t1, puis nouvelle jointure pour récupérer les variables de t1 et t2,....) cela va assez vite (moins de 10 minutes), mais je pense qu'il doit y avoir une solution beaucoup plus "propre" en une seule requête ? le souci est que le bout de code ci-dessus ne se termine pas au bout de 3/4h... ?

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Wow
    Je ne suis pas sur d'avoir tout compris à votre langage

    Qu'appelez vous des "variables"? des colonnes?

    Donnez nous votre vrai requête (exemple avez seulement 2 ou 3 tables).
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Désolé pour le langage un peu brouillon :
    oui mes "variables" sont des colonnes de valeurs numériques.
    Pour être plus concret disons que j'ai
    - une table t0 des départements (colonne 'ID')
    - une table t1 de recensement de la population par âge par commune (colonnes 'POP_0_10ans', 'POP_11_20ans',...)
    - une table t2 de recensement d'équipements par commune (colonnes 'NB_hopitaux', 'NB_ecoles', 'NB_BarsPMU', ....)
    - une table t3 de stats de ventes de voitures par marque par commune (colonnes 'Peugeot', 'Lexus', 'LADA', ....)
    Je souhaiterais donc récupérer l'ensemble de ces colonnes aggrégées par département dans ma table tabResult. Mais au vu du temps de traitement SQL j'ai un doute que le code ci-dessous soit le plus correct pour faire cela... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t0.ID, SUM(t1.var11), SUM(t1.POP_0_10ans), SUM(t1.POP_11_20ans), ..., SUM(t2.NB_hopitaux), SUM(t2.NB_ecoles), ..., SUM(t3.Peugeot),...
    INTO tabResult
    FROM ((t0
    LEFT JOIN t1 ON t0.ID=t1.ID)
    LEFT JOIN t2 ON t0.ID=t2.ID)
    LEFT JOIN t3 ON t0.ID=t3.ID
    GROUP BY t0.ID

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Discussion résolue?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/05/2015, 01h38
  2. Jointure LEFT JOIN avec Double COUNT
    Par Mike91 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/03/2015, 12h37
  3. [Débutant] Report viewer avec requete sur plusieurs tables
    Par Eman1307 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 04/04/2013, 11h01
  4. [AC-2003] Requête sur plusieurs tables dans une seule liste
    Par tarnx dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/12/2009, 11h36
  5. [Avis] Vue avec union sur plusieurs tables
    Par adiGuba dans le forum Langage SQL
    Réponses: 0
    Dernier message: 22/09/2008, 11h50

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