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 :

Formule dans un champs réutilisée dans un autre champs


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Formule dans un champs réutilisée dans un autre champs
    Bonjour et encore une fois merci d'avance

    J'ai, dans un select, un champ CT_Mat_N_3 avec sa formule à rallonge... (ligne 4):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                  Select  ART_N0, CT_Mat_N0, 
                          COMPSANT_N1, CT_Mat_N1, CT_Mat_N1-CT_Mat_N2-CT_Mat_N3 as CT_Mat_N_1,
                          CompSant_N2, [CT_Mat_N_3]+1 AS CT_Mat_N_2,
                          CompSant_N3, CT_Mat_N3-(((CT_Mat_N4-((CT_Mat_N5-CT_Mat_N6)+(CT_Mat_N6)))+(CT_Mat_N5-CT_Mat_N6)+CT_Mat_N6)-((CT_Mat_N4-((CT_Mat_N5-CT_Mat_N6)+(CT_Mat_N6)))+(CT_Mat_N5-CT_Mat_N6)+CT_Mat_N6)/TxRebN3) AS CT_Mat_N_3,
    Je souhaiterais prendre ce champ CT_Mat_N_3 pour le réutiliser en formule dans un autre champ CT_Mat_N_2. (ligne 3)

    Mais je ne sais pas si c'est faisable comme dans ACCESS... et si oui je ne sais pas le transcrire.

    Merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 161
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Non tu ne peux pas utiliser un alias résultant d'une expression pour le réutiliser pour une autre expression au même niveau. Il faut que tu passes d'abord par une sous-requête ou un bloc with.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Bonjour,

    La première chose à faire face à une telle requête, c'est de s'assurer que la formule à rallonge ne peut pas être simplifiée.
    Si la requête qui est présentée est vraiment celle qui est exécutée, l'expression peut en effet être largement améliorée, d'abord en ôtant les parenthèses inutiles, ensuite en enlevant les expressions à résultante nulle du type CT_Mat_N5 - CT_Mat_N6 - CT_Mat_N5 + CT_Mat_N6.

    Ensuite, comme le propose vanagreg, le plus simple est de ramener les calculs intermédiaires dans une table dérivée (sous-requête dans la clause FROM) ou dans une expression de table (bloc WITH au début de la requête).

    Par exemple :
    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
    WITH    calcul
        AS  (   SELECT  ART_N0
                    ,   CT_Mat_N0
                    ,   CompSant_N1
                    ,   CT_Mat_N1
                    ,   CT_Mat_N1 - CT_Mat_N2 - CT_Mat_N3 as CT_Mat_N_1
                    ,   CompSant_N2
                    ,   CompSant_N3
                    ,   CT_Mat_N3 - CT_Mat_N4 + (CT_Mat_N4 / TxRebN3) AS CT_Mat_N_3
                    ,   ...
                FROM    ...
            )   
    SELECT  ART_N0
        ,   CT_Mat_N0
        ,   CompSant_N1
        ,   CT_Mat_N1
        ,   CT_Mat_N_1
        ,   CompSant_N2
        ,   CT_Mat_N_3 + 1 as CT_Mat_N_2
        ,   CompSant_N3
        ,   CT_Mat_N_3
        ,   ...
    FROM    calcul
    ;

  4. #4
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Ok merci pour vos réponses ! Je vais partir avec du WITH.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/01/2021, 18h00
  2. Insérer une formule dans un autre classeur
    Par YDevY dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/01/2012, 10h09
  3. Ajouter un champ dans une autre base Access
    Par scaalp dans le forum Access
    Réponses: 2
    Dernier message: 20/10/2005, 16h34
  4. order by "un-champ-dans-une-autre-table"
    Par SnakeBoudoir dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/03/2005, 11h55
  5. Récupération des champs d'un form dans un autre
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 22/06/2004, 11h31

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