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 :

Mise à jour d'un champ avec la somme de plusieurs champs selon critères [10g]


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Mise à jour d'un champ avec la somme de plusieurs champs selon critères
    Bonjour si quelqu'un peu m'aider sur le probleme suivant:

    je doit faire la mise à jour d'un champ SO avec la somme des champs SO,1,2,2E,3,3U,NE selon critere voici mon SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update dgp 
    set cl_so_liais_trav_piedroit_d = (select  cl_so_liais_trav_piedroit_d + cl_1_liais_trav_piedroit_d + cl_2_liais_trav_piedroit_d + cl_2E_liais_trav_piedroit_d + cl_3_liais_trav_piedroit_d + cl_3U_liais_trav_piedroit_d + cl_NE_liais_trav_piedroit_d from dgp where liais_trav_pdrt='ENC' and campagne=2015) 
    where liais_trav_pdrt='ENC' and campagne=2015;
    l'erreur est :
    Erreur SQL : ORA-01427: sous-interrogation ramenant un enregistrement de plus d'une ligne

    D'avance merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    S'il s'agit de mettre à jour une colonne à partir des valeurs d'autres colonnes de la ligne, il n'est pas nécessaire de passer par une sous-requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update  dgp 
        set cl_so_liais_trav_piedroit_d = cl_so_liais_trav_piedroit_d + cl_1_liais_trav_piedroit_d + cl_2_liais_trav_piedroit_d + cl_2E_liais_trav_piedroit_d + cl_3_liais_trav_piedroit_d + cl_3U_liais_trav_piedroit_d + cl_NE_liais_trav_piedroit_d 
    where   liais_trav_pdrt = 'ENC'
        and campagne        = 2015
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    La sous-requête SELECT est inutile, faîtes directement la somme dans l'update.
    Bon la colonne cl_so_liais_trav_piedroit_d n'a pas non plus une grande utilité.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    merci al1_24, cependant, j'ai omis un point, le calcul se fait sur des champs contenant des valeurs nulles. j'ai essayé avec COALESCE(), mais le résultat est toujours null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update  dgp 
        set CL_SO_LIAIS_TRAV_PIEDROIT_D = coalesce(NULL,CL_SO_LIAIS_TRAV_PIEDROIT_D)+ coalesce(NULL,cl_1_liais_trav_piedroit_d)+ coalesce(NULL,cl_2_liais_trav_piedroit_d)+ coalesce(NULL,cl_2E_liais_trav_piedroit_d)+ coalesce(NULL,cl_3_liais_trav_piedroit_d)+ coalesce(NULL,cl_3U_liais_trav_piedroit_d)+ coalesce(NULL,cl_NE_liais_trav_piedroit_d) 
    where   liais_trav_pdrt = 'ENC'
        and campagne        = 2015
    ;
    Merci skuatamad, cependant la colonne cl_so_liais_trav_piedroit_d peut contenir une valeur.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    La fonction COALESCE retourne la première valeur non nulle dans ses arguments. Ce n'est pas de cette manière qu'il faut l'utiliser.
    COALESCE(exp1, exp2, ..., exp3) est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE WHEN exp1 IS NOT NULL THEN exp1
       WHEN exp2 IS NOT NULL THEN exp2
       ...
       ELSE expN
    END
    Ta requête s'écrirait donc ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    update  dgp 
        set cl_so_liais_trav_piedroit_d = coalesce(cl_so_liais_trav_piedroit_d, 0) 
                + coalesce(cl_1_liais_trav_piedroit_d, 0) 
                + coalesce(cl_2_liais_trav_piedroit_d, 0) 
                + coalesce(cl_2E_liais_trav_piedroit_d, 0) 
                + coalesce(cl_3_liais_trav_piedroit_d, 0) 
                + coalesce(cl_3U_liais_trav_piedroit_d, 0) 
                + coalesce(cl_NE_liais_trav_piedroit_d, 0) 
    where   liais_trav_pdrt = 'ENC'
        and campagne        = 2015
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci al1_24, quelle rapidité de réponse, c'est exactement ce que j'attendais.



  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Tu as juste eu la chance que je passe par là au bon moment...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/03/2011, 14h28
  2. Mise à jour d'une BDD avec un champ accentué
    Par gyome314 dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 13/09/2007, 09h14
  3. [DOM4J] Mise à jour des docs xml avec dom4j
    Par kodo dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/04/2006, 21h48
  4. Mise à jour dans un formulaire avec condition
    Par Bourni dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2006, 22h13
  5. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46

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