[SQL] Requête UPDATE complexe

Requête UPDATE complexe [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 27-09-2007 à 12:11:06    

Salut !
 
      Je travaille sur mySQL v4.
J'ai une table reglements qui contient entre autres :
- un identifiant (ID_REGLEMENT)
- un numéro (N_REGLEMENT)  
- un lien vers une autre entrée de la table règlement (ID_REGLEMENT_LIE) (parfois à null)
 
Ce que je voudrais, c'est que désormais les règlements reliés par le champ ID_REGLEMENT_LIE portent le même numéro.
Je ne sais pas si c'est possible de faire ça uniquement en SQL ?
 
 
j'essaie qq petites choses mais je sens bien que je vais dans la mauvaise direction :

Code :
  1. UPDATE reglements r1
  2. SET r1.N_REGLEMENT=(
  3. SELECT r2.N_REGLEMENT
  4. FROM reglements r2
  5. WHERE r2.ID_REGLEMENT=r1.ID_REGLEMENT_LIE
  6. )


ça me rend l'erreur :
#1093 - You can't specify target table 'reglements' for update in FROM clause

Message cité 1 fois
Message édité par sire de Botcor le 27-09-2007 à 12:13:23

---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 27-09-2007 à 12:11:06   

Reply

Marsh Posté le 27-09-2007 à 12:16:34    

ton r1 n'est pas connu dans ta sous requête...

Reply

Marsh Posté le 27-09-2007 à 12:21:54    

jpcheck a écrit :

ton r1 n'est pas connu dans ta sous requête...


Merci, je viens donc de tester ceci :

Code :
  1. UPDATE reglements r1
  2. SET r1.N_REGLEMENT=(
  3. SELECT r2.N_REGLEMENT
  4. FROM reglements r2
  5. JOIN reglements r1 ON r1.ID_REGLEMENT_LIE = r2.ID_REGLEMENT
  6. )


 
sans plus de succès :( (même erreur)


Message édité par sire de Botcor le 27-09-2007 à 12:22:46

---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 27-09-2007 à 12:30:01    

en plus, ce qui semble foireux, c'est que si tu as plusieurs retours dans ta sous requête ca marchera jamais.
r1 et r2 sont la même table non ?
 
en fait je comprends pas le pb sinon, tu as le droit de faire un where dans ton update tu sais ?

Reply

Marsh Posté le 27-09-2007 à 12:49:16    

ce serait pas plutot?
 
 

Code :
  1. UPDATE reglements r1
  2. SET r1.N_REGLEMENT=(   
  3.    SELECT r2.N_REGLEMENT   
  4.    FROM reglements r2   
  5.    where r1.ID_REGLEMENT_LIE = r2.ID_REGLEMENT)

Reply

Marsh Posté le 27-09-2007 à 12:51:05    

ben il me semble que c'est ca qui lui pond une erreur...

Reply

Marsh Posté le 27-09-2007 à 12:52:43    

oops non c'est foireux,
vu que tu veux avoir le même numéro de règles tu dois n'en faire remonter qu'une, ca c'est a toi de décider laquelle par rapport a ton modèle, mais genre un max marcherait

Reply

Marsh Posté le 27-09-2007 à 13:19:28    

oui, r1 et r2 sont la même table
il n'y a pas 2 lignes avec le même ID_REGLEMENT_LIE
 
faire un where ? oui, mais je ne vois pas comment :(
 
merci casimimir, mais c'est ma requête de départ, ça ne fonctionne pas :/
 


---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 27-09-2007 à 14:51:15    

personne n'a une idée ?


---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 27-09-2007 à 16:14:13    

UPDATE..FROM
 

sire de Botcor a écrit :


Code :
  1. UPDATE reglements
  2. SET N_REGLEMENT=r2.N_REGLEMENT
  3. FROM reglements r2
  4. WHERE ID_REGLEMENT_LIE = r2.ID_REGLEMENT




 
?

Reply

Marsh Posté le 27-09-2007 à 16:14:13   

Reply

Marsh Posté le 27-09-2007 à 16:16:38    

euh lire la doc ça aide :o

Citation :

Currently, you cannot update a table and select from the same table in a subquery.

Reply

Marsh Posté le 27-09-2007 à 17:29:12    

jpcheck a écrit :

ton r1 n'est pas connu dans ta sous requête...


Si ça s'apelle une requete correllée. :o
 
EDIT : Meme si syntaxiquement elle est pas correcte.


Message édité par MEI le 27-09-2007 à 17:30:41

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 27-09-2007 à 17:35:34    

pikti a écrit :

UPDATE..FROM

Code :
  1. UPDATE reglements
  2. SET N_REGLEMENT=r2.N_REGLEMENT
  3. FROM reglements r2
  4. WHERE ID_REGLEMENT_LIE = r2.ID_REGLEMENT


?


 
 MySQL a répondu: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM reglements r2
   
      WHERE ID_REGLEMENT_LIE = r2.ID_REGLEMENT' at line 5
 
 :(


Message édité par sire de Botcor le 27-09-2007 à 17:36:37

---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 27-09-2007 à 17:37:49    

anapajari a écrit :

euh lire la doc ça aide :o

Citation :

Currently, you cannot update a table and select from the same table in a subquery.



donc c'est impossible ?


---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 27-09-2007 à 17:50:37    

Ceci dit a mon avis y'a aussi une grosse erreur de conception là dedans.
 
Car tu vas avoir apres ta requete :
ID | N | ID_LIE
1 | ABC | 2
2 | ABC | 1  
3 | DEF | null
 
Pourquoi avoir 2 n° qui pointe vers le meme reglement ? :o
Alors soit c'est le meme et tu le fusionne, soit s'en est deux et la faut les differencier mieux que ça ;)

Message cité 1 fois
Message édité par MEI le 27-09-2007 à 17:52:46

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 27-09-2007 à 20:56:50    

MEI a écrit :

Ceci dit a mon avis y'a aussi une grosse erreur de conception là dedans.
 
Car tu vas avoir apres ta requete :
ID | N | ID_LIE
1 | ABC | 2
2 | ABC | 1  
3 | DEF | null
 
Pourquoi avoir 2 n° qui pointe vers le meme reglement ? :o
Alors soit c'est le meme et tu le fusionne, soit s'en est deux et la faut les differencier mieux que ça ;)


c'est une demande précise du patron :o  :sweat:


---------------
«Ceux qui croient que les peuples suivront leurs intérêts et non leurs passions n’ont rien compris au XXe siècle.» © Raymond Aron
Reply

Marsh Posté le 28-09-2007 à 09:45:00    

sire de Botcor a écrit :


c'est une demande précise du patron :o  :sweat:


Ca me semble au contraire parfaitement logique...
 
J'ai une facture de 1000 € à payer.
Je demande à payer en 3 fois.
Il n'y a rien de particulier à garder un lien vers le premier versement, ça permet aisément de récupérer la liste de tous les règlements d'une même transaction.

Reply

Marsh Posté le 28-09-2007 à 09:46:24    

Bon, sinon, vu la limitation de MySQL, je pense que t'es bon pour un script PHP ou autre, même si c'est du one shot.
 
Effectivement MySQL semble lever un verroux exclusif sur la table entière lors de la mise à jour (table lock au lieu de faire un row lock) et du coup il lui est impossible de lire en même temps dedans.

Reply

Sujets relatifs:

Leave a Replay

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