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 a jour multiple


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 78
    Points
    78
    Par défaut mise a jour multiple
    J'ai un pb de mise à jour.
    Je connais mon erreur mais je ne sais pas du tt comment la resoudre...

    Voila la requete:

    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
    28
    29
    update FRH set (fait_id,frh.absence_id,
      frh.temps_id,
      frh.temps_id_fin,
      frh.salarie_id,
      nb_jour_ouvre )= 
     
    (select DISTINCT frh.fait_id,
      frh.absence_id,
      frh.temps_id,
      frh.temps_id_fin,
      frh.salarie_id,
    (CASE 
    WHEN sum(drh_temps.ferie) = to_date(frh.temps_id_fin)-to_date(frh.temps_id)+1 AND To_CHAR(frh.temps_id,'D')='6' THEN 0
    WHEN sum(drh_temps.ferie) = to_date(frh.temps_id_fin)-to_date(frh.temps_id)+1 AND To_CHAR(frh.temps_id,'D')='7' THEN 0
    WHEN sum(drh_temps.ferie) is null THEN (to_date(frh.temps_id_fin)-to_date(frh.temps_id)) + 1
    WHEN sum(drh_temps.ferie)>=1 THEN to_date(frh.temps_id_fin)-to_date(frh.temps_id)-sum(drh_temps.ferie)+1
    ELSE 0
    END) as NB_JOUR_OUVRE
    from frh,drh_temps
    where drh_temps.temps_id between frh.temps_id and frh.temps_id_fin
    And absence_id is not null
    and fait_id=(select distinct frh.fait_id from frh where absence_id is not null 
    and nb_jour_ouvre is null)
    group by frh.fait_id,frh.absence_id,
      frh.temps_id,
      frh.temps_id_fin,
      frh.salarie_id)
     
    WHERE fait_id=(select distinct frh.fait_id from frh where absence_id is not null and nb_jour_ouvre is null )
    L'erreur est :
    ORA-01427: single-row subquery returns more than one row

    Ce qui est parfaitement logique.
    En fait, j'ai besoin absolument de mettre a jour NB_JOUR_OUVRE. Mais pour faire l'update et pour que la sous-requete fonctionne, il me faut lire ts les champs....

    Vous avez une solution?

    Merci d'avance!

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    A l'instinct : il ne manquerai pas un niveau de sous requete ?
    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
    28
    29
    30
    update FRH set (fait_id,frh.absence_id,
      frh.temps_id,
      frh.temps_id_fin,
      frh.salarie_id,
      nb_jour_ouvre )= 
    (select * from
    (select DISTINCT frh.fait_id,
      frh.absence_id,
      frh.temps_id,
      frh.temps_id_fin,
      frh.salarie_id,
    (CASE 
    WHEN sum(drh_temps.ferie) = to_date(frh.temps_id_fin)-to_date(frh.temps_id)+1 AND To_CHAR(frh.temps_id,'D')='6' THEN 0
    WHEN sum(drh_temps.ferie) = to_date(frh.temps_id_fin)-to_date(frh.temps_id)+1 AND To_CHAR(frh.temps_id,'D')='7' THEN 0
    WHEN sum(drh_temps.ferie) is null THEN (to_date(frh.temps_id_fin)-to_date(frh.temps_id)) + 1
    WHEN sum(drh_temps.ferie)>=1 THEN to_date(frh.temps_id_fin)-to_date(frh.temps_id)-sum(drh_temps.ferie)+1
    ELSE 0
    END) as NB_JOUR_OUVRE
    from frh,drh_temps
    where drh_temps.temps_id between frh.temps_id and frh.temps_id_fin
    And absence_id is not null
    and fait_id=(select distinct frh.fait_id from frh where absence_id is not null 
    and nb_jour_ouvre is null)
    group by frh.fait_id,frh.absence_id,
      frh.temps_id,
      frh.temps_id_fin,
      frh.salarie_id) FRH_MAJ
    where FRH.fait_id = FRH_MAJ.fait_id)
    WHERE fait_id=(select distinct frh.fait_id from frh where absence_id is not null and nb_jour_ouvre is null )
    Je penche, donc je suis

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu sais quelle sous requete ramène plus d'une ligne ?
    Moi je pense à celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE fait_id=(SELECT DISTINCT frh.fait_id 
    FROM frh 
    WHERE absence_id IS NOT NULL 
    AND nb_jour_ouvre IS NULL )
    Sinon évite les DISTINCT et les GROUP BY combinés.. ça sert à rien.

    En fait ta requete est fausse, faut tout relier à frh de l'UPDATE.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ce serait pas plutôt un code comme celui ci ?
    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
    UPDATE FRH frh
    SET nb_jour_ouvre = 
    (SELECT (CASE 
    	WHEN SUM(ferie) = frh.temps_id_fin-frh.temps_id+1 AND TO_CHAR(frh.temps_id,'D')='6' THEN 0
    	WHEN SUM(ferie) = frh.temps_id_fin-frh.temps_id+1 AND TO_CHAR(frh.temps_id,'D')='7' THEN 0
    	WHEN SUM(ferie) IS NULL THEN frh.temps_id_fin - frh.temps_id + 1
    	WHEN SUM(ferie)>=1 THEN frh.temps_id_fin-frh.temps_id-SUM(drh_temps.ferie)+1
    	ELSE 0
    	END) AS NB_JOUR_OUVRE
    FROM DRH_TEMPS
    WHERE drh_temps.temps_id BETWEEN frh.temps_id AND frh.temps_id_fin
    )
    WHERE fait_id IN (	SELECT fait_id
    		FROM FRH 
    		WHERE absence_id IS NOT NULL 
    		AND nb_jour_ouvre IS NULL )
    PS : Pas de TO_DATE sur une DATE !
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 78
    Points
    78
    Par défaut
    Merci beaucoup. c'est exactement ce que je voulais.

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Au fait, fait_id : C'est la PK de FRH ?

    Si oui, faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE fait_id IN (	SELECT fait_id
    		FROM FRH 
    		WHERE absence_id IS NOT NULL 
    		AND nb_jour_ouvre IS NULL )
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE absence_id IS NOT NULL 
    AND nb_jour_ouvre IS NULL
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 78
    Points
    78
    Par défaut
    oui j'avais fait la correction

    MErci bcp!

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

Discussions similaires

  1. [MySQL] Mise à jour multiple depuis un tableau
    Par robinmaret dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 04/12/2009, 10h07
  2. problème de mise a jour
    Par leeloo076 dans le forum ASP
    Réponses: 3
    Dernier message: 15/04/2004, 16h09
  3. Mise a jour mandrake linux 9.2
    Par Otacan dans le forum Mandriva / Mageia
    Réponses: 2
    Dernier message: 02/04/2004, 22h47
  4. [] [Install] Problème de mise à jour des dll
    Par pepper dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 23/01/2003, 22h34
  5. Visualisation des mise à jour en réseau
    Par fandor7 dans le forum Paradox
    Réponses: 2
    Dernier message: 06/12/2002, 15h54

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