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 :

Requête avec deux MAX .


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Requête avec deux MAX .
    Bonjour,

    j'ai un petit souci avec ma requête ,en apparence bête mais très gourmande

    Le but est de réduire les performances: actuellement s'execute en 40 sec pour une table énorme mais pour ramener qu'une seule ligne
    Ya t'il une façon de l'optimiser ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    SELECT 
              B1NOM 
            , B1PRENOM 
            , B1DTN 
            , BVPERMIS 
            , B1NUMERO 
            , B1CCSS 
     
    FROM DT_EMBAUCHES A 
     
    WHERE ( 
               A.B1CCSS = 0 
         AND A.DATEENVOI = (SELECT MAX (B.DATEENVOI) 
                            FROM DT_EMBAUCHES B 
                            WHERE A.B1NUMERO = B.B1NUMERO) 
         AND A.BVPERMIS = (SELECT MAX (B.BVPERMIS) 
                           FROM PROD.DT_EMBAUCHES B 
                          WHERE A.B1NUMERO = B.B1NUMERO) 
         AND A.BVPERMIS >= 0 
         AND A.CODEMVT <> 'AN' 
         AND A.BVPERMIS > 885399 
               ) 
    ORDER BY 
                A.BVPERMIS 
    OPTIMIZE FOR 12 ROWS
    J'ai essayé avec ça ,mais rien ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT B.* 
    FROM 
           (SELECT * 
             FROM INCID.DT_EMBAUCHES A 
            WHERE BVPERMIS = (SELECT MAX(BVPERMIS) 
                               FROM DT_EMBAUCHES C 
                               WHERE A.B1NUMERO = C.B1NUMERO) 
                                        AND A.B1CCSS = 0 
                                        AND A.BVPERMIS > 885399 
                                        AND A.CODEMVT <> 'AN') B 
    WHERE B.DATEENVOI = (SELECT MAX(DATEENVOI) 
                           FROM IDT_EMBAUCHES C 
                           WHERE B.B1NUMERO = C.B1NUMERO)
    Merci par avance pour votre aide
    Marc

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Est-ce que tu peux indenter ta requête et la mettre entre les balises
    [CODE] ?

    Ou alors nous expliquer avec des mots ce que tu essaies de faire ?

    Parce que là, c'est relativement indigeste

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Merci Chtulhu

    Bon, je pense que l'un des trucs pas géniaux, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         AND A.DATEENVOI = (SELECT MAX (B.DATEENVOI) 
                            FROM DT_EMBAUCHES B 
                            WHERE A.B1NUMERO = B.B1NUMERO) 
         AND A.BVPERMIS = (SELECT MAX (B.BVPERMIS) 
                           FROM PROD.DT_EMBAUCHES B 
                          WHERE A.B1NUMERO = B.B1NUMERO)
    C'est quoi ton SGBD ?
    S'il accepte les "CTE", tu peux agréger à part tes max, puis faire la jointure ensuite (il y a moyen que ça t'évite de recalculer trop de fois)
    Bon, comme j'ai un tout petit peu la flemme, je vais pas reprendre tout ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH tmp AS 
    (
    SELECT max(date1) as d1, max(BVPERMIS) as b1, B1NUMERO
    FROM DT_EMBAUCHES 
    GROUP BY B1NUMERO
    )
    SELECT a.*
    FROM DT_EMBAUCHES a JOIN tmp
      ON a.B1NUMERO = tmp.B1NUMERO
      AND a.date1 = tmp.d1
      AND a.b1 = tmp.b1
    (j'espère que ça marche...)

Discussions similaires

  1. Requête avec deux JOIN
    Par Tintou dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/09/2007, 19h03
  2. Une requête avec un Max sur 2 champs
    Par Bils dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/09/2007, 15h04
  3. Requête avec deux tables m:m
    Par Seb981 dans le forum Langage SQL
    Réponses: 23
    Dernier message: 10/09/2007, 15h15
  4. résultats requête avec deux tables
    Par ideal23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2007, 11h10
  5. Problème de requête avec WHERE MAX()
    Par seb92500 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/01/2007, 13h27

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