[Oracle] Update avec jointure

Update avec jointure [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 31-10-2005 à 20:10:20    

Pour un coup que c'est moi qui ai besoin d'aide dans cette cat :D
 
Alors voilà, je veux faire ça :

Code :
  1. update prm
  2. set prm.nompro = substr(prm.tradesig2, 1, 30),
  3. prm.tradesig1 = prm.tradesig3
  4. from pro
  5. where prm.codsoc = 3
  6. and prm.codlan in ('MAG', 'ENG')
  7. and pro.codsoc = prm.codsoc
  8. and pro.codpro = prm.codpro
  9. and pro.sigfou = 'CADES'


 
Sauf que cette syntaxe doit marcher avec SQL Server 2000, mais pas avec Oracle...
 
C'est quoi la syntaxe Oracle ?
 
Ca marche pas non plus :/

Code :
  1. update prm, pro
  2. set prm.nompro = substr(prm.tradesig2, 1, 30),
  3. prm.tradesig1 = prm.tradesig3
  4. where prm.codsoc = 3
  5. and prm.codlan in ('MAG', 'ENG')
  6. and pro.codsoc = prm.codsoc
  7. and pro.codpro = prm.codpro
  8. and pro.sigfou = 'CADES'


 
Oracle 8.1.7
 
(z'allez voir qu'à tous les coups c'est supporté à partir de la 9i :/)


Message édité par Arjuna le 31-10-2005 à 20:13:34
Reply

Marsh Posté le 31-10-2005 à 20:10:20   

Reply

Marsh Posté le 31-10-2005 à 20:15:40    

Vu la prise de tête dans ce topic, je craind fortement que ça n'existe pas :cry:

Reply

Marsh Posté le 31-10-2005 à 20:21:40    

Ben ?
 
Y'a quoi qui va pas là ?

Code :
  1. update prm
  2. set prm.nompro = (
  3. select substr(prm2.tradesig2, 1, 30)
  4. from prm prm2, pro
  5. where pro.codsoc = prm.codsoc
  6. and pro.codpro = prm.codpro
  7. and pro.sigfou = 'CADES'
  8. and prm2.codsoc = pro.codsoc
  9. and prm2.codpro = pro.codpro
  10. and prm2.codlan = prm.codlan),
  11. prm.tradesig1 = (
  12. select prm2.tradesig3
  13. from prm prm2, pro
  14. where pro.codsoc = prm.codsoc
  15. and pro.codpro = prm.codpro
  16. and pro.sigfou = 'CADES'
  17. and prm2.codsoc = pro.codsoc
  18. and prm2.codpro = pro.codpro
  19. and prm2.codlan = prm.codlan)
  20. where prm.codsoc = 3
  21. and prm.codlan in ('MAG', 'ENG')


 
Il update un peu plus de 30000 lignes au lieu de 270 !

Reply

Marsh Posté le 31-10-2005 à 20:25:45    

Bon, à priori, la requête était bonne, mais le compteur de mises à jour déconnait...
 
J'ai rajouté une ligne pour être sûr, et maintenant il met bien à jour 270 lignes :)
 

Code :
  1. update prm
  2. set prm.nompro = (
  3. select substr(prm2.tradesig2, 1, 30)
  4. from prm prm2, pro
  5. where pro.codsoc = prm.codsoc
  6. and pro.codpro = prm.codpro
  7. and pro.sigfou = 'CADES'
  8. and prm2.codsoc = pro.codsoc
  9. and prm2.codpro = pro.codpro
  10. and prm2.codlan = prm.codlan),
  11. prm.tradesig1 = (
  12. select prm2.tradesig3
  13. from prm prm2, pro
  14. where pro.codsoc = prm.codsoc
  15. and pro.codpro = prm.codpro
  16. and pro.sigfou = 'CADES'
  17. and prm2.codsoc = pro.codsoc
  18. and prm2.codpro = pro.codpro
  19. and prm2.codlan = prm.codlan)
  20. where prm.codsoc = 3
  21. and prm.codlan in ('MAG', 'ENG')
  22. and exists(select null from pro where pro.codsoc = prm.codsoc and pro.codpro = prm.codpro and pro.sigfou = 'CADES')


 
Merci pour votre soutien !
 
(j'espère qu'il y en a au moins un qui a lu la topic :D)

Reply

Marsh Posté le 01-11-2005 à 13:27:15    

Regarde ici :
 
http://www.psoug.org/reference/update.html
 
Apparemment la 10g contient plein de façons de le faire, faudrait voir ce qui est compatible 8i.

Reply

Marsh Posté le 01-11-2005 à 13:29:11    

Arjuna a écrit :

Ben ?
 
Y'a quoi qui va pas là ?

Code :
  1. update prm
  2. set prm.nompro = (
  3. select substr(prm2.tradesig2, 1, 30)
  4. from prm prm2, pro
  5. where pro.codsoc = prm.codsoc
  6. and pro.codpro = prm.codpro
  7. and pro.sigfou = 'CADES'
  8. and prm2.codsoc = pro.codsoc
  9. and prm2.codpro = pro.codpro
  10. and prm2.codlan = prm.codlan),
  11. prm.tradesig1 = (
  12. select prm2.tradesig3
  13. from prm prm2, pro
  14. where pro.codsoc = prm.codsoc
  15. and pro.codpro = prm.codpro
  16. and pro.sigfou = 'CADES'
  17. and prm2.codsoc = pro.codsoc
  18. and prm2.codpro = pro.codpro
  19. and prm2.codlan = prm.codlan)
  20. where prm.codsoc = 3
  21. and prm.codlan in ('MAG', 'ENG')


 
Il update un peu plus de 30000 lignes au lieu de 270 !


ca fait toujours plaisir ce genre de problemes surtout en prod


Message édité par betsamee le 01-11-2005 à 13:29:36
Reply

Marsh Posté le 01-11-2005 à 13:44:02    

A la limite il vaut mieux se faire une petite procédure PL/SQL lisible, plutôt qu'une requête pas très lisible à cause des conditions répétées ...

Reply

Marsh Posté le 01-11-2005 à 14:04:16    

c'était juste pour corriger des données, du one shot quoi, donc le PL ça me lourdait pour faire ça ;)

Reply

Marsh Posté le 01-11-2005 à 15:53:49    

Bah c'est pas la mort :
 

Code :
  1. begin
  2.   for r in (
  3.     select <id>,
  4.            substr(prm.tradesig2, 1, 30) as new_nompro,
  5.            tradesig3 as new_tradesig1
  6.     from prm, pro
  7.     where prm.codsoc = 3
  8.     and prm.codlan in ('MAG', 'ENG')
  9.     and pro.codsoc = prm.codsoc
  10.     and pro.codpro = prm.codpro 
  11.     and pro.sigfou = 'CADES'
  12.   )
  13.   loop
  14.     update prm
  15.     set nompro = r.new_nompro,
  16.         tradesig1 = r.new_tradesig1
  17.     where <id> = r.<id>;
  18.   end loop;
  19. end;

Reply

Sujets relatifs:

Leave a Replay

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