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] Optimisation de requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 55
    Points : 38
    Points
    38
    Par défaut [Oracle] Optimisation de requête
    Bonjour,

    j'ai cette magnifique requete :

    SELECT ava.oid as DOSSIER_ID,
    ( SELECT distinct avaa.etape FROM TEA.AVA_AVARIE avaa WHERE avaa.dossier_reparation = ava.oid ) as ETAPE_AVARIE_LIB_LTX,
    ( SELECT distinct avaa.entite_operationnelle FROM TEA.AVA_AVARIE avaa WHERE avaa.dossier_reparation = ava.oid ) as ENTITE_OP_GESTION_ID,
    nvl(ava.vehicule,( SELECT distinct avaa.vehicule FROM TEA.AVA_AVARIE avaa WHERE avaa.dossier_reparation = ava.oid )) as VEHICULE_ID,
    ava.tiers_responsable as TIERS_RESPONSABLE_ID,
    ava.entite_operationnelle as ENTITE_OP_RESPONSABLE_ID,
    ava.montant_total_ht as MONTANT_TOTAL_REPARATION_MT,
    enu.libelle_lng as STATUT_DOSSIER_LIB_LTX
    FROM TEA.AVA_DOSSIER_REPARATION ava,
    TEA.ENU_STATUT_ADM_DOSSIER enu
    WHERE
    /* On ne récupère pas les dossiers au statut enregistré */
    enu.constante <> 'STA_ADM_DOSS_ENREG'
    AND
    enu.OID = ava.statut_dossier
    AND
    enu.OID = ava.statut_dossier

    J'aurais voulu savoir s'il était possible de m'éviter de répeter mes trois select entre parenthèses (qui récuperent l'etape,l'entite_operationnelle et le véhicule), et ne les avoir qu'une seule fois dans ma requete.
    Je les ai mis comme cela car en placant ma recherche dans la requete principale j'obtiens plusieurs lignes (en effet plusieurs avaries peuvent etre rattachées à un même dossier du coup le résultat final .. mais vu que meme si j'ai plusieurs lignes mes trois champs "etape,entite operationnelle et véhicule" seront identiques je ne veux les récupérer qu'une seule et unique fois)

    La requete que j'ai au dessus me donne le bon résultat mais je me dis que ce n'est peut etre pas la plus "propre" possible..

    en schématisant ca pour que ce soit plus clair..


    table ava

    un enregistrement avec oid = 13

    table avaa

    enregistrement 1
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654

    enregistrement 2
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654

    enregistrement 3
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654

    RESULTAT FINAL
    Une seule ligne
    oid = 13
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654

    et pas 3..........

    oid = 13
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654

    oid = 13
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654

    oid = 13
    dossier_reparation = 13
    avaa.etape = 12
    avaa.entite_operationnelle = 123156
    avaa.vehicule = 541654


    Merci de votre aide!!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 121
    Points : 28 534
    Points
    28 534
    Par défaut
    Et comme ça, ça donne quoi ? :
    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
    27
    SELECT  ava.oid     as DOSSIER_ID
        ,   avaa.etape  as ETAPE_AVARIE_LIB_LTX
        ,   avaa.entite_operationnelle  as ENTITE_OP_GESTION_ID
        ,   NVL(ava.vehicule, avaa.vehicule) as VEHICULE_ID,
        ,   ava.tiers_responsable as TIERS_RESPONSABLE_ID,
        ,   ava.entite_operationnelle as ENTITE_OP_RESPONSABLE_ID,
        ,   ava.montant_total_ht as MONTANT_TOTAL_REPARATION_MT,
        ,   enu.libelle_lng as STATUT_DOSSIER_LIB_LTX
    FROM
            TEA.AVA_DOSSIER_REPARATION ava
        INNER JOIN
            TEA.ENU_STATUT_ADM_DOSSIER enu
            ON  enu.OID = ava.statut_dossier
            AND enu.OID = ava.statut_dossier
        INNER JOIN
            (   SELECT  etape
                    ,   entite_operationnelle
                    ,   vehicule
                FROM TEA.AVA_AVARIE
                GROUP BY    etape
                        ,   entite_operationnelle
                        ,   vehicule
            )   AS avaa
            ON  avaa.dossier_reparation = ava.oid
    WHERE
    /* On ne récupère pas les dossiers au statut enregistré */
            enu.constante <> 'STA_ADM_DOSS_ENREG'

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    euhh je ne sais pas si c'est le fait d'etre sous oracle mais ca ne marche pas (j'ai viré les virgules en double dans le select au départ mais ca ne change rien), il me fait une erreur... le logiciel me dit (je travaille avec TOAD) "ORA-00905 mot clé absent" et j'ai fait une recherche sur ce type d'erreur :

    Cause: You tried to execute a statement, but you missed a required keyword.

  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 : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Quel version d'Oracle : les jointures normaliées (INNER JOIN) ne sont supportées qu'à partir de la version 9

    (D'où l'utilité de tenir compte des CONSEILS... à lire AVANT de POSTER et de systématiquement spécifier le SGBD avec lequel on travaille)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Oups désolé de ne pas l'avoir précisé.. mais pour moi c'était "évident" vu que ma version est récente.. la 9..pour être précis
    Oracle9i Enterprise Edition Release 9.2.0.1.0
    encore desolé..

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Je viens de trouver pourquoi cela ne marchait pas.. il manquait le dossier_reparation dans le select pour pouvoir le test après dessus.. techniquement ca fonctionne.. maintenant je vais regarder si cela me renvoie bien les bons résultats.. en tout cas merci pour l'aide

    SELECT ava.oid as DOSSIER_ID
    , avaa.etape as ETAPE_AVARIE_LIB_LTX
    , avaa.entite_operationnelle as ENTITE_OP_GESTION_ID
    , NVL(ava.vehicule, avaa.vehicule) as VEHICULE_ID
    , ava.tiers_responsable as TIERS_RESPONSABLE_ID
    , ava.entite_operationnelle as ENTITE_OP_RESPONSABLE_ID
    , ava.montant_total_ht as MONTANT_TOTAL_REPARATION_MT
    , enu.libelle_lng as STATUT_DOSSIER_LIB_LTX
    FROM
    TEA.AVA_DOSSIER_REPARATION ava
    INNER JOIN
    TEA.ENU_STATUT_ADM_DOSSIER enu
    ON enu.OID = ava.statut_dossier
    INNER JOIN
    ( SELECT dossier_reparation
    , etape
    , entite_operationnelle
    , vehicule
    FROM TEA.AVA_AVARIE
    GROUP BY dossier_reparation
    , etape
    , entite_operationnelle
    , vehicule
    ) avaa ON avaa.dossier_reparation = ava.oid
    WHERE
    /* On ne récupère pas les dossiers au statut enregistré */
    enu.constante <> 'STA_ADM_DOSS_ENREG'

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 121
    Points : 28 534
    Points
    28 534
    Par défaut
    Je suis confus

    J'ai encore été trop rapide.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/07/2013, 11h01
  2. [Débutant] [vb.net & oracle]Optimiser ma recherche
    Par jacko842 dans le forum VB.NET
    Réponses: 9
    Dernier message: 13/05/2013, 15h45
  3. [Oracle] Optimisation sql
    Par darkangel23fr dans le forum SQL
    Réponses: 7
    Dernier message: 16/02/2009, 16h24
  4. Réponses: 2
    Dernier message: 18/09/2007, 12h14
  5. [API C] se connecter sous Oracle : optimisation
    Par fages dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 18/05/2006, 23h08

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