|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | |
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Bonjour,
Je dois m'occuper de mettre à jour une table à partir des valeurs d'une deuxième. J'ai donc fait le script qui fonctionne (vous m'aviez aidé pour le faire Je dois donc les remplir en me servant de la date et en les remplissant avec les mêmes champs que la requête précédente sauf que je dois prendre une valeur de date proche de celle de la table 1. J'ai pensé faire un test avec la valeur du mois mais ça n'a rien donné de concluant. J'imagine qu'il existe une fonction pour cela mais je n'ai rien trouvé de tel. Structure de la table : Citation:
Le mieux serait de récupérer la valeur précédente au niveau de la date. De plus, les 2 tables sont dans des schémas différents En espérant m'être fait comprendre, merci. |
|
|
|
01
|
|
|
#2 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 649 ![]() |
Bonjour,
Après 3 lectures je n'ai toujorus rien compris de ce que vous voullez. ceci étant dit vu le poste précédant (ca aurai été cool de le linker) je pense qu'il faudrai que vous passiez un peu de temps sur les tuto sql de ce forum. A défaut revenez ici en précisant : quelle table voullez-vous updater ? sur quel critère de sélection ? Que veut dire "Le mieux serait de récupérer la valeur précédente au niveau de la date" ? Citation:
|
|
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Je vais essayer d'être plus clair :
j'ai une table 1 que je met à jour avec des informations de table 2. Certains champs de table 1 sont vides après la mise à jour car les critères de sélection prennent en compte la date, or la date concernée par la ligne vide n'existe pas dans la table 2. Par contre, j'ai des dates proches dans la table 2 (par exemple, 10/02/2010 dans la table 1 et 07/02/2010 dans la table 2). Ce qu'il faudrait, c'est substituer la valeur de la date de la table 1 par celle de la table 2 afin que les champs vides de la table 1 soient remplis. Et la valeur "remplacée" doit être la plus proche possible et si possible du même mois. Donc ce que j'aimerais, c'est trouver comment faire pour prendre comme date dans la condition de jointure pour la table 1 une date approximative (= celle de la table 2) pour que la jointure table1.date = table2.date soit correcte, afin que l'update concerne toutes les lignes. J'ai essayé d'être clair dans mes explications. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 649 ![]() |
Quel est votre requête actuel en fait ?
|
|
|
00
|
|
|
#5 | |
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 979 ![]() |
Citation:
Pouvez-vous nous mettre votre début de requête, un exemple complet (parce qu'ici il n'y a nul part un champ vide) et le résultat attendu.
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
|
|
|
10
|
|
|
#6 | ||
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Code :
|
||
|
|
00
|
|
|
#7 | |
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Citation:
Le problème se pose quand la date de la table 1 ne se trouve pas dans la table 2. Pour le résultat, il devrait être sensiblement le même que si la date était la même (champs à récupérer dont des tarifs qui changent selon le mois en gros). |
|
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 979 ![]() |
Citation:
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
|
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
|
|
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 649 ![]() |
D'après ce que je comprend, votre table1 est une image de la table2.
Pourquoi leur primary key diverge ? |
|
|
00
|
|
|
#11 | |||||
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Je suis en train d'essayer ceci :
Code :
Citation:
Citation:
Qu'est ce que tu entends par Citation:
Une modif de la structure des informations a fait que la table 2 ne convenait plus. Une table 1 a donc été crée et pour le début on récupère les informations à partir de table 2 ainsi que d'autres endroits. Par contre, certains champs ne sont pas remplis a cause de ce problème de date, je dois donc trouver un moyen de les remplir. |
|||||
|
|
00
|
|
|
#12 | |||
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 979 ![]() |
Citation:
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
|||
|
|
10
|
|
|
#13 |
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
|
|
|
00
|
|
|
#14 | ||
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 979 ![]() |
Vu que tu n'as pas vraiment de règle, ne pourrais-tu pas remplacer la date de la table 1 par la date de la table 2 sans faire de vérification sur la date ?
Ça donnerai : Code :
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
||
|
|
00
|
|
|
#15 | |
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Citation:
Donc ta solution ne fonctionne malheureusement pas (risque d'erreurs :s) Et c'est pourquoi on m'a conseillé d'utiliser une requête imbriquée qui ramènerait toutes les lignes de la table 2 dont la date est inférieure à celle de la table 1 puis avec une fonction MAX, on récupère la valeur la plus haute (qui correspond donc à la date la plus proche de celle recherchée). Comment je pourrais faire pour intégrer cette sous-requête à ma requête initiale ? |
|
|
|
00
|
|
|
#16 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 649 ![]() |
|
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Tu peux utiliser un MERGE INTO - j'ai essayé de garder les notations, ce qui ne simplifie pas la tache et rend compliqué tout test, mais bon l'idée y est !
Code :
|
||
|
|
00
|
|
|
#18 | ||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Est ce que ce SELECT correspond au besoin ?
Code :
Code :
|
||||
|
|
00
|
|
|
#19 | ||
|
Membre régulier
![]() Nicolas Étudiant Inscription : mai 2010 Messages : 308 ![]() |
Je ne pense pas que ces merge into fonctionnent bien pour mon cas. Ce n'est pas la date que je veux mettre à jour, mais d'autres champs.
La requête que j'ai pour le moment : Code :
Mais ce script ne remplit pas les champs vides de la table invoiceD mais met à jour quand même des lignes. Je vois pas trop la :/ |
||
|
|
00
|
|
|
#20 | ||||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut,
- Le merge qu'on ta donné met à jour la date mais ce n'est pas son destin... il met à jour ce que tu lui dis de mettre à jour dans la clause WHEN MATCHED => Cherche un peu, essaie de comprendre ce truc que tu ne connais pas -- en tous cas visiblement pas très bien : c'est génial et ça t'aidera beaucoup - Ton script met à jour toutes les lignes qui répondent à : Code :
- Toutes tes sous-requêtes comportent exactement le même WHERE... et cherchent des max. Cela signifie que pour chaque ligne de facture, tu cherches les max de plusieurs champs. Au lieu de faire trois requête, tu peux faire une requête GROUP BY qui te donne tous ces max. => Considère que c'est le résultat de cette requête qui doit mettre à jour ta table, et utilise le MERGE qu'on t'a préconisé. - Il faut absolument mettre des alias différents pour tes tables, c'est vraiment imbittable comme ça... - Pour ton besoin de récupérer la csc correspondant à la date la récente, tu peux utiliser la fonction KEEP Code :
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||||
|
00
|
Copyright © 2000-2012 - www.developpez.com