|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Bonjour,
Je travaille sous Oracle 10.1.0.5.0 J'ai une table "pro" dont la clé est "codsoc, codpro". J'ai une seconde table "prm" dont la clé est "codsoc, codpro, codlan". J'ai modifié en masse la table "prm". J'ai modifié ces champs "datmod et utimod" avec la date du jour et mon nom afin d'avoir une trace de qui a modifié ces libellés de produits. Maintenant, je désire mettre à jour la table "pro" avec le même datmod et utimod pour toutes les lignes que j'ai modifié dans "prm" (en reprenant la liaison sur codsoc, codpro). Voici la requête que j'ai écrit (qui fonctionne) : Code :
Comme on voit, on retrouve deux fois plus ou moins la même sous-requête. Outre le problème de performances, cette écriture est particulièrement crade. Existe-t-il une syntaxe plus propre ? SQL Server permet notamment les jointures sur les update, ce qui rend l'écriture de telles requêtes de mise à jour plus simple. |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
|
|
|
10
|
|
|
#3 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Merci pour l'astuce du MERGE.
Même si je suis pas fan de sa syntaxe, je vais tenter de me familiariser avec, c'est toujours mieux que la bouse que j'utilise habituellement Ce serait quand même plus pratique si la jointure était supportée
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
|
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Avec quelle syntaxe ?
|
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Je connais cette syntaxe aussi, mais c'est limite si elle est pas pire que les deux autres réunie...
Code :
|
||
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
Bein dans le document joint (mon 1er poste), il y a 4 types d'updates différent, la syntaxe y est.
|
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Je suis désolé, mais dans le document, je vois :
- Utilisation d'un update conventionnel => Ce que j'ai fais. - Utilisation de l'instruction Merge => Ce vers quoi je vais certainement m'orienter à l'avenir - Utilisation d'un Update de sous-requête => Chose qui me semble assez aléatoire en termes de résultats, pas certain qu'on puisse mettre à jour systématiquement ce qu'on veut de cette façon (même limitation que sur les UPDATE de VIEW) Je ne vois donc que 3 méthodes d'update. Vous pouvez d'ailleurs ajouter celle que j'ai rajouté (pourrie, certes, mais qui a le mérite d'exister) En revanche, aucune des méthodes décrite ne fait de jointure. Une jointre sur update, c'est ça : Code :
|
||
|
|
00
|
|
|
#9 | ||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
cette syntaxe là ne convient-elle pas ?
Code :
Code :
Je ne vois pas bien en quoi il va différer de votre dernière proposition au niveau des UPDATE possibe (vu que grosso-modo on va tomber dans les même cas bizarre au vu de la syntaxe) ? sinon oui vous avez raison, ce n'est pas 4 syntaxes différentes mais 4 méthodes |
||||
|
|
00
|
|
|
#10 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#11 | |||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Citation:
Il sert à rien de la comparer à la première syntaxe que j'ai posté, puisque je cherche justement à la remplacer par mieux. A la limite, je préfère le MERGE ou même mon FOR ... LOOP. D'autant que cette version porte à confusion. Non, dans l'article, moi je ne vois que 3 méthode. Il y a juste une méthode découpée en deux avec un test sur des index (j'ai pas lu en détail), mais la requête est rigoureusement la même, seule l'architecture de la base change. |
|||
|
|
00
|
|
|
#12 | |||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
Citation:
Code :
Code :
|
|||||
|
|
00
|
|
|
#13 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Update
Citation:
|
|
|
|
00
|
|
|
#14 | |||||||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Citation:
1/ Utilisation d'une sous-requête, avec tout ce que cela implique quant aux performances. 2/ Impossibilité de mettre à jour A si plusieurs lignes de B correspondant à une même ligne de A (restrictions sur les update de jointure, comme je le disais). Exemple : EVE : Table des livraisons (enfin, dans notre cas, c'est des livraisons) EVP : Table du détail des livraisons Comme vous le savez, la TVA italienne est passée de 20% à 21% le 17 septembre dernier. Suite au changement de paramétrage un peu tardif, je dois mettre à jour en passe toutes les livraisons saisies avec une date de livraison postérieure au 17 septembre. Code :
Ces deux syntaxes n'ont donc absolument RIEN d'équivalent, ni d'un point de vue performances (plan d'exécution), ni d'un point de vue fonctionnalité (l'un utilise une simple jointure, quand l'autre utilise une vue). Du coup pour la seconde requête, je suis obligé d'utiliser cette requête : Code :
|
|||||||||
|
|
00
|
|
|
#15 |
![]() ![]() |
StringBuilder, la syntaxe FOR LOOP c'est du PL/SQL, pas un ordre SQL simple, et en terme de temps d'exécution c'est probablement ce qu'il y a de pire.
À éviter tant que faire se peut. Pour continuer sur le sujet, j'avoue que j'aime bien la syntaxe de SQL-Server, mais elle est propriétaire à MS et hors norme. MERGE à l'avantage d'être décris dans SQL:2003, supporté chez Oracle depuis Oracle 9i, et chez Microsoft depuis SQL-Server 2008 (ainsi que DB2 et FireBird si j'en crois wikipedia) , et sera de plus en plus adapté. Avec toutes les facilités d'écriture qu'il contient, il n'y a aucune raison de ne pas l'utiliser (c'est ma méthode préférée vous l'aurez compris).
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#16 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
C'est effectivement cette syntaxe que je vais utiliser à l'avenir.
Je la trouve lourde et peu claire, mais elle a le mérite d'être normalisée et de répondre à tous les cas. |
|
|
00
|
|
|
#17 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
2) Comme je vous disais il y une différence philosophique : un produit vous laisse faire n’importe quoi un autre vous tape sur les doigts. Et comment faite-vous quand ça ne tombe plus bien ? |
|
|
|
00
|
|
|
#18 | |||||
|
Membre éclairé
![]() |
Mais pourquoi aller plus loin?
Citation:
Code :
|
|||||
|
|
02
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Parce que dans ce cas les enregistrements qui n'existent pas dans prm vont être mises à jour avec null.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com