Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2010, 18h00   #1
Nouveau Membre du Club
 
Matthieu Maquevice
Inscription : février 2008
Messages : 106
Détails du profil
Informations personnelles :
Nom : Matthieu Maquevice
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2008
Messages : 106
Points : 37
Points : 37
Par défaut problème requete update

Hello,

J'ai un problème avec une requete :

Code :
1
2
3
4
5
6
7
8
9
10
 
UPDATE CONTRAT c
SET c.MONTANT_CONTRAT = 
(
SELECT m.MONTANT  
FROM MONTANTS m 
WHERE m.CONTRAT_ID = c.CONTRAT_ID
AND m.MONTANT_DATE=(SELECT max(m1.EXE_EXECDATE) FROM MONTANTS m1 WHERE m1.CONTRAT_ID=c.CONTRAT_ID)
)
WHERE EXISTS (SELECT 1 FROM MONTANTS m WHERE m.CONTRAT_ID = c.CONTRAT_ID);
J'ai une l'erreur suivante :

Citation:
SQLState: 42000
ErrorCode: 904
Position: 82
Error: ORA-00937: la fonction de groupe ne porte pas sur un groupe simple
Je ne vois pas d'où peut provenir cette erreur car dans ma sous-requete je n'ai qu'une expression de groupe (max) mais pas de champs individuels.

Des idées ??

Merci
-=mateo=- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 18h39   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 925
Points : 1 925
Je pense que le problème vient de m1.CONTRAT_ID=c.CONTRAT_ID car oracle ne connait pas c.CONTRAT_ID, tu es un niveau trop bas.
Comme tu as déjà m.CONTRAT_ID = c.CONTRAT_ID essaie avec m1.CONTRAT_ID=m.CONTRAT_ID
Code :
1
2
3
4
5
6
7
8
9
UPDATE CONTRAT c
SET c.MONTANT_CONTRAT = 
(
SELECT m.MONTANT  
FROM MONTANTS m 
WHERE m.CONTRAT_ID = c.CONTRAT_ID
AND m.MONTANT_DATE=(SELECT max(m1.EXE_EXECDATE) FROM MONTANTS m1 WHERE m1.CONTRAT_ID=m.CONTRAT_ID)
)
WHERE EXISTS (SELECT 1 FROM MONTANTS m WHERE m.CONTRAT_ID = c.CONTRAT_ID);
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 10h43   #3
Nouveau Membre du Club
 
Matthieu Maquevice
Inscription : février 2008
Messages : 106
Détails du profil
Informations personnelles :
Nom : Matthieu Maquevice
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2008
Messages : 106
Points : 37
Points : 37
Merci pour ta réponse.

En fait je me suis un peu emmeler les pinceaux... C'était l'erreur 1427 que j'ai eu en fait :
Citation:
ORA-1427: single-row subquery returns more than one row
Ce qui est plus logique...

Du coup je m'en suis sorti en rajoutant un max :

Code :
1
2
3
4
5
6
7
8
9
10
 
UPDATE CONTRAT c
SET c.MONTANT_CONTRAT = 
(
SELECT max(m.MONTANT)  
FROM MONTANTS m 
WHERE m.CONTRAT_ID = c.CONTRAT_ID
AND m.MONTANT_DATE=(SELECT max(m1.EXE_EXECDATE) FROM MONTANTS m1 WHERE m1.CONTRAT_ID=c.CONTRAT_ID)
)
WHERE EXISTS (SELECT 1 FROM MONTANTS m WHERE m.CONTRAT_ID = c.CONTRAT_ID);
Ce qui reste cohérent avec mon modèle.

Merci
-=mateo=- est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h18.


 
 
 
 
Partenaires

Hébergement Web