|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Bonjour,
Voici mon problème. J'ai une première table dans laquelle j'ai une ligne différente pour chaque mois et je cherche à regrouper toutes les données sur une même ligne de ma table finale, qui contient donc une colonne pour la mesure pour chacun des 12 derniers mois. Ma solution actuelle est de mettre toutes les données de la première table dans un cursor et de faire 12 updates dans la boucle dans laquelle je fetche le cursor, un pour chaque mois, avec à chaque fois la clause where permettant de ne faire l'update que si le record est du bon mois. Je pense que si la condition du where était mise dans un if avant la commande d'update je pourrais gagner pas mal en temps d'exécution mais je ne parviens pas à avoir une syntaxe correcte. Sinon si vous avez d'autres idées elles sont les bienvenues. Voici ma boucle dans l'état actuel (qui fonctionne mais avec tps d'exécution désastreux): Code :
|
||
|
|
00
|
|
|
#2 | ||||||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
déjà si tu remplaces :
Code :
Par : Code :
Ensuite tu peux probablement supprimer le curseur pour intégrer la requête dans l'UPDATE genre : Code :
Code :
TO_CHAR(SYSDATE,'MMYYYY') = (SELECT month||year FROM <la requête du curseur>) |
||||||
|
|
00
|
|
|
#3 | ||
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Excuse moi de mettre ce que tu dis en doute mais je ne vois pas très bien en quoi mon code va être plus rapide.
Le select est maintenant répété 12 fois au lieu de l'unique fois pour l'insérer dans le cursor voici l'ébauche de code, pour les 2 premiers mois seulement (à répéter donc pour les 12 autres en changeant la condition) Code :
|
||
|
|
00
|
|
|
#4 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Tu peux probablement utiliser la clause WITH et de toute façon, vaut mieux faire le SELECT 2 fois que l'update 12 fois multiplié par le nombre de lignes du curseur
Et supprime tes conditions : Code :
|
||
|
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Oki, merci beaucoup, je vais aller faire ma réécriture et tester
|
|
|
00
|
|
|
#6 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Tout compte fait j'ai quand même encore un souci, je ne vois pas comment faire en une seule update, j'ai beau retourner les case when et decode dans tout les sens.... il ne faut évidement pas qu'une étape faisant l'update d'une colonne écrase la valeur d'une autre colonne (si je fais un select avec un case when pour chaque colonne, une seule aura une valeur, celle du mois concerné alors que les autres vaudront null...)
|
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Un truc de ce stype :
Code :
CASE WHEN condition OK THEN newvalue ELSE colonne |
|
|
00
|
|
|
#8 | ||
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
voilà où j'en suis:
Code :
Je ne comprends pas étant donné qu'un group by est fait dans la sous requête interne et qu'ensuite je fais une jointure sur tout les éléments sur lequels le group by a été fait dans la sous-requête. Quelqu'un voit il d'où peut venir le problème? Merci |
||
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
la sous requête après le SET retourne plus d'une ligne
|
|
|
00
|
|
|
#10 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Jusque là j'avais compris... mais comment celà est il possible?
Cette sous requête sélectionne ses lignes dans la table subs venant d'une autre sous-requête et dans laquelle on a un group by sur tout les éléments qui vont servir à la sélection (et aucun autre) |
|
|
00
|
|
|
#11 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Je n'ai pas regardé les détails mais si tu as 10g tu pourrais voir l'instruction MERGE.
|
|
|
00
|
|
|
#12 | |
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
Citation:
il n'y a qu'une seule ligne dans cmc_subscription_usage. ps : le MERGE existe à partir de la 9i |
|
|
|
00
|
|
|
#13 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
C'est pourquoi je parle de 10g qui permet de faire soit update soit insert soit les deux avec l'instruction MERGE contrairement à 9i
__________________
Consultant et formateur Oracle |
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
Rectifications : il n'y a qu'une seule ligne par couple (n_pers_prs, n_abon, nam_code, etl.YEAR).
Intéressant |
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
|
|
|
00
|
|
|
#16 | |||
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
Citation:
j'espère que je n'ai pas mis trop de coquilles... Code :
Une optimisation est effectivement, de se demander si l'on met à jour des vielles données (des années passéesà ou seulement les données de l'année en cours (voir le commentaire). |
|||
|
|
00
|
|
|
#17 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Merci, je vais voir comment je pourrais adapter ça chez moi. Il ne s'agit effectivement pas de prendre le mois 1 de l'année puis les mois 2 de l'année mais de mettre dans m le mois en cours, dans m1 le mois précédent... et il fayut tenir compte du fait qu'en fonction du mois en cours il y a x mois ce situe soit cette année ci soit l'année précédente....
|
|
|
00
|
|
|
#18 | |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 31 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com