Update du premier enregistrement correspondant - SQL/NoSQL - Programmation
Marsh Posté le 14-09-2011 à 10:28:19
Il faut que utilises un LIMIT 1 dans ton update. Allié avec MIN ca devrait le faire.
Marsh Posté le 14-09-2011 à 10:33:11
il me semblait que sous access, le LIMIT 1 n'est pas supporté mais remplacé par le TOP 1 qui lui même n'est pas supporté en update ... me trompes je ?
Marsh Posté le 14-09-2011 à 10:52:33
Par ailleurs, je viens de regarder de pres l'aide d'access, Le prédicat TOP ne choisit pas entre des valeurs égales, autrement dit, il va updater l'ensemble des enregistrements ayant la même date, et pas le premier ...
Marsh Posté le 14-09-2011 à 11:08:29
Oups pardon tu as raison.
Tente d'imbriquer un select avec un TOP 1 dans le critère de ton update
Un truc du style :
UPDATE ...
WHERE Campagne_Id IN (SELECT TOP 1 Campagne_Id FROM WHERE MIN(Campagne_Date) AND flag is null)
Marsh Posté le 14-09-2011 à 11:11:53
vi vi j'ai tenté, mais le problème c'est :
Citation : Le prédicat TOP ne choisit pas entre des valeurs égales |
LA requête SELECT retourne donc TOUS les enregistrments ayant la même campagne_date, même si je mets un TOP 1 ... c'est balaud (pour ne pas dire pire) mais c'est access !!!
Marsh Posté le 14-09-2011 à 11:17:14
someoneelseishere a écrit : vi vi j'ai tenté, mais le problème c'est :
|
Fait crade à ce moment la. Imbrique un SELECT qui te renvoie les MIN, imbriqué dans un SELECT sur le TOP de ta clé primaire (unique ton TOP devrait te renvoyer un seul résultat) imbriqué dans un UPDATE grace à ta clé primaire.
Marsh Posté le 14-09-2011 à 11:28:54
pfiou ... là j'ai plus rien compris
Tu peux préciser le fond de ta pensée ???
Par ailleurs, je vais essayer de résumer le besoin afin de voir si la solution n'est pas ailleurs :
La requête dont nous parlons a pour destination d'apposer un flag sur un dossier client permettant au conseiller de s'approprier le dossier le temps de son traitement, ce afin de s'assurer qu'aucun autre gestionnaire ne va le traiter en simultané. Par ailleurs, elle permet d'updater le champs Campagne_Date à la valeur Now() ce afin de repositionner le dossier en fin de campagne.
Bien entendu, dès la fin de traitement du dossier (cad dès que le conseiller change de fiche client), le flag est supprimé libérant ainsi le dossier.
Y'a t'il plus simple ?
Marsh Posté le 14-09-2011 à 11:51:44
J'ai un doute la.
Tu me dis que le "TOP ne choisit pas entre des valeurs égales". Du coup si tu fais un SELECT TOP 1 Campagne_Date, en gros il vas te sortir les différents enregistrements de Campagne_Date alors que tu n'en veux qu'un.
Il ne faut donc pas faire le TOP sur Campagne_Date
Du coup ma requete de tout à l'heure devrait passer :
UPDATE ...
WHERE Campagne_Id IN (SELECT TOP 1 Campagne_Id FROM WHERE MIN(Campagne_Date) AND flag is null)
Ton Campagne_Id est unique donc le SELECT TOP 1 Campagne_Id devrait te sélectionner un premier ID (vu qu'ils sont tous différents par définition)
Non ?
Marsh Posté le 14-09-2011 à 11:54:59
..sauf qu'il ne choisit pas entre des valeurs égales issus du WHERE ...
en d'autres termes, même en mettant le top 1 sur Campagne_Id, la requête update tous les enregistrements ayant la même campagne_date puisque faisant partie du WHERE.
J'ai même essayé en supprimant le min(campagne_date) et en le remplacant par un order by campagne_date , même effet !
Marsh Posté le 14-09-2011 à 11:56:45
someoneelseishere a écrit : ..sauf qu'il ne choisit pas entre des valeurs égales issus du WHERE ... |
Si tu fais juste le SELECT "SELECT TOP 1 Campagne_Id FROM WHERE MIN(Campagne_Date) AND flag is null", il te renvoie quoi ?
Marsh Posté le 14-09-2011 à 12:00:07
si j'ai un enregistrement dont la campagne_date est plus petite que toutes les autres, il me le renvoie, si j'ai plusieurs enregistrements ayant cettre même campagne_date, il les renvoi tous
Marsh Posté le 14-09-2011 à 12:02:15
la requête telle qu'elle est :
Code :
|
Marsh Posté le 14-09-2011 à 14:51:02
C'est le comportement normal de ta requete. Avec un Select top 1, le top 1 est sur le select, pas sur le nombre de ligne a mettre a jour.
Ton select doit retourner un champ unique (primary key ou unique key), sinon il faut faire autrement.
Je ne connais pas assez Access mais UPDATE (TOP 1) SET ... WHERE ... ne fonctionne pas?
Marsh Posté le 14-09-2011 à 15:02:58
non, le top1 ne peut se faire sur une transaction update.
Marsh Posté le 14-09-2011 à 15:19:05
On s'embrouille en fait avec le MIN qui n'est pas adapté. (le MIN sert à chopper la valeur minimale pour une autre valeur de colonne fixe)
Si tu fais tout simplement :
SELECT TOP 1 campagne_id
FROM tt_campagne
WHERE Campagne_Flag Is Null
ORDER BY Campagne_Date ASC
(ca devrait te filler le bon ID que tu imbriques dans ton update)
Marsh Posté le 14-09-2011 à 16:38:57
Dans son cas le campagne_id ,n'est pas unique, donc c'est normal qu'il update plusieurs ligne.
Ya pas une combinaison client_id, campagne_id ?
Si il n'y a pas de clé unique, ben faut en créer une
Marsh Posté le 14-09-2011 à 09:29:28
Bonjour à tous
Etant plutot très débutant sur SQL, j'ai besoin de vos conseils avisés pour la requête suivante :
Sur une table Access contenant
un identifiant unique (Campagne_Id)
une date (Campagne_Date)
un flag (Campagne_Flag)
je souhaites updater les champs Campagne_Date et Campagne_Flag du premier enregistrement présentant les conditions suivantes :
flag is null
min(Campagne_Date)
sachant que plusieurs enregistrement peuvent présenter la même date d'ou le besoin d'updater le PREMIER enregistrement correspondant, sachant que je n'ai pas de préférence quant à l'ordre de selection de ce premier enregistrement.
J'ai essayé de caser un "top 1" mais ca n'est pas accepté dans les requêtes UPDATE ...
Quelqu'un peut m'aider ?