[MySQL]Execution d'une sous requete qui retourne plusieurs lignes

Execution d'une sous requete qui retourne plusieurs lignes [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 20-02-2007 à 15:48:38    

Bonjour,  
 
J'ai une sous requetes qui me retournes plusieurs ID_CLIENT et j'aimerais faire sur ces clients faire un update dans la table resiliation.
 
 
j'ai essayé comme requete :  
 
 

update RESILIATION set DATE_DEPART='2007-03-01', FICHIER=''
 
where ID_CLIENT =  
 
   (  
    select RE.ID_CLIENT  
    from `CLIENT` C  
      inner join FACTURE R on C.HD=R.HD  
      inner join RESILIATION RE on C.ID_CLIENT=RE.ID_CLIENT  
       
    where  
     R.ETAT_PRINCIPAL!='RESILIER'  
    and  
     RE.FICHIER != ''  
    and  
     RE.TYPE_RESIL in ('0', '2')
   )


 
mais le problème, cela me retourne l'erreur :ERROR 1242: Subquery returns more than 1 row
 
k'ai donc essayé en remplacant le = par un in  
 
 

update RESILIATION set DATE_DEPART='2007-03-01', FICHIER=''
 
where ID_CLIENT in  
 
   (  
    select RE.ID_CLIENT  
    from `CLIENT` C  
      inner join FACTURE R on C.HD=R.HD  
      inner join RESILIATION RE on C.ID_CLIENT=RE.ID_CLIENT  
       
    where  
     R.ETAT_PRINCIPAL!='RESILIER'  
    and  
     RE.FICHIER != ''  
    and  
     RE.TYPE_RESIL in ('0', '2')
   )


 
mais maintenant, j'ai l'erreur ERROR 1093: You can't specify target table 'RESILIATION' for update in FROM clause ...
 
Et malheuresement selon le site de MySQL :

Citation :

Il est valide d'utiliser une sous-requête lors d'une affectation dans une commande UPDATE, car les sous-requêtes sont valides avec les commandes UPDATE et DELETE, tout comme dans les commandes SELECT. Cependant, vous ne pouvez pas les utiliser sur la même table, qui est ici t1, car cette table est alors la cible de la clause FROM et de la commande UPDATE.


http://dev.mysql.com/doc/refman/5. [...] rrors.html
 
 
 
Est ce qu'il y aurait donc moyen de faire une seule requete ce que j'aimerais bien faire ?

Reply

Marsh Posté le 20-02-2007 à 15:48:38   

Reply

Marsh Posté le 20-02-2007 à 15:58:26    

Code :
  1. update RESILIATION RE set DATE_DEPART='2007-03-01', FICHIER=''
  2. where exists
  3.    RE.FICHIERS != '' AND
  4.    RE.TYPE_RESIL in ('0', '2') AND
  5.    EXISTS
  6.    ( 
  7.     select C.ID_CLIENT
  8.     from `CLIENT` C 
  9.       inner join FACTURE R on C.HD=R.HD 
  10.     where 
  11.      R.ETAT_PRINCIPAL!='RESILIER' 
  12.     and 
  13.      C.ID_CLIENT = RE.ID_CLIENT
  14.    )


Message édité par anapajari le 20-02-2007 à 15:58:56
Reply

Marsh Posté le 20-02-2007 à 16:36:03    

curieux, ces 2 exists. Il faut que je reéxecute cette requette ds 15 jours. Je réessairai.

Reply

Marsh Posté le 20-02-2007 à 16:48:57    

nan mais j'ai écrit de tête et  merdé la requete hein s'tout :o
faut virer celui qu'est a coté du where :o

Reply

Marsh Posté le 20-02-2007 à 17:11:33    

rohhhhhh  :o  
merci pour l'astuce ....
je comprends le principe, je verrais ds 15 jours.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed