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

SQL Oracle Discussion :

Optimisation select max


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Par défaut Optimisation select max
    Bonjour,

    Je cherche à optimiser une requête comportant une sous-requête de la forme suivante :
    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
     
    SELECT table1.champ1, table1.champ2, table1.champ3, table1.champ4, table1.champ5, table1.champ6, table1.champ7, table3.champ1
    FROM table1, table2, table3, table4
    WHERE table1.champ1='TOTO' 
    AND table1.date1 >= TO_DATE('JJMMAAAA','DD/MM/YYYY') 
    AND table1.champ2 =  table4.champ2 
    AND table4.champ9 = 1
    AND table3.champ1 = table1.champ1 
    AND table3.champ3 = table3.champ3
    AND table1.champ10 = '2013'
    AND table3.champmax = ( 
    	SELECT MAX(table3_2.champcible)
    	  FROM  table3_2, table4_2
    	  WHERE table3_2.champ1 = table3.champ1 
    	  AND  table3_2.champ2 = table4_2.champ2 
    	  AND  table3_2.champ3 = table4_2.champ9 
    	  AND  table4_2.champ5 = 'VA' 
    	) 
    ORDER BY table1.champ8;
    Dans l'idée je voudrais trouver un moyen de réécrire cette requête en supprimant la double lecture de table due à l'utilisation de la sous-requête de select max.

    J'ai chercher des informations sur le net pour modifier ce type de requête. Et je suis tombé sur des syntaxes du type :
    SELECT MAX() over (partition by ) As mon_max

    J'ai essayé de modifier ma requête en utilisant ce principe mais je ne comprend pas bien comment cela fonctionne et en conséquence ne parviens pas à réécrire ma requête qui est actuellement de ce style là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT table1.champ1, table1.champ2, table1.champ3, table1.champ4, table1.champ5, table1.champ6, table1.champ7, table3.champ1,
     MAX(table3_2.champcible) over (partition by table3_2.champ2, table3_2.champ3) As mon_max
    FROM table1, table2, table3, table4
    WHERE table1.champ1='TOTO' 
    AND table1.date1 >= TO_DATE('JJMMAAAA','DD/MM/YYYY') 
    AND table1.champ2 =  table4.champ2 
    AND table4.champ9 = 1
    AND table3.champ1 = table1.champ1 
    AND table3.champ3 = table3.champ3
    AND table1.champ10 = '2013'
    AND table3.champmax = mon_max
    ORDER BY table1.champ8;
    Mais dans ce code (qui ne fonctionne) pas je perd la jointure entre table3 et table3_2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table3_2.champ1 = table3.champ1
    ainsi que la condition de l'état VA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table4_2.champ5 = 'VA'
    Quelqu'un saurait-il m'expliquer comment cette syntaxe
    SELECT MAX() over (partition by ) As mon_max
    peut être appliquée a une requête de la même forme que la mienne qui impacte plusieurs table et ayant plusieurs condition dans la sous-requête ?

    Ou tout simplement me dire que ce n'est pas possible. Ca ne me dérange pas que ce ne soit pas faisable de cette façon. Mais si ça l'est, ça m'intéresse vraiment de comprendre le fonctionnement et de pouvoir l'utiliser sur d'autre requête de la même forme.

    Vous l'aurez bien compris je ne demande pas nécessairement une solution aboutie, mais je cherche surtout à comprendre et apprendre via ce post.

    Merci d'avance pour vos réponses !

  2. #2
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Bonjour,

    MAX( ) OVER ([PARTITION BY] . . .) est la version analytique de la fonction max.
    Pour plus d'information concernant les fonctions analytiques je vous invite à lire la documentation en ligne, le chapitre dédié à ces fonctions.

    http://www.oracle.com/pls/db112/to_U...tm%23sthref904

    Mais, à mon avis, ce n'est pas du tout ce que vous cherchez, car il n'est pas possible d'avoir une fonction analytique dans la clause WHERE. En outre, d'après le contexte de votre problème ceci n'aura pas de sens car actuellement vous calculez max dans un Correlated Subquery (sous-requête corrélée), donc un calcul par chaque ligne de la table de la requête externe.

    Vous avez dit
    Dans l'idée je voudrais trouver un moyen de réécrire cette requête en supprimant la double lecture de table due à l'utilisation de la sous-requête de select max.
    Je ne vois pas où est la double lecture, dans la sous requête max vous avez spécifié deux tables: accgcgehci et ACOPOPERCL. Ces deux ne figure pas dans la clause FROM de SELECT global.

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Par défaut
    Merci pour vos réponses.

    Oui effectivement je ne suis pas certain que la version analytique du select max soit la solution que je cherche car comme vous le signalez je calcul le max dans sous-requête corrélée.

    Pour répondre à votre question, les tables table3 et table3_2 sont identiques ainsi que les tables table4 et table4_2.
    Je reconnais que ce n'était pas clair du tout dans la mesure ou j'ai changé les noms des tables étant donné que je suis dans un contexte professionnel et que je ne voulais pas faire apparaitre les noms réels.
    Cela étant j'attaque bien dans ma sous-requête les mêmes tables que dans la requête principale.

    Pour en revenir à mon problème, existerait-il selon vous un moyen de ré-écrire la requête d'une autre façon, ou dans mon cas de figure c'est le choix de développement qui s'impose?

    Merci.

  4. #4
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Désolé, mais n'ayant pas la description exacte et réelle des tables et la description des colonnes ainsi que les contraintes sur les tables il est impossible de faire une étude.

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Bonsoir,

    Si je peux me permettre faites de vrais jointures pour commencer !

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



Discussions similaires

  1. problème avec un select max
    Par bobic dans le forum Oracle
    Réponses: 7
    Dernier message: 14/11/2005, 11h22
  2. [SQL] requete select max
    Par kabikou dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 19/10/2005, 16h18
  3. Aide pour un SELECT MAX(...)
    Par Gladiator dans le forum Langage SQL
    Réponses: 7
    Dernier message: 24/06/2005, 16h48
  4. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 14h39
  5. Problème select MAX(annee) dans une requête
    Par grisounette dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 28/10/2004, 17h36

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