Update du premier enregistrement correspondant

Update du premier enregistrement correspondant - SQL/NoSQL - Programmation

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 ?

Reply

Marsh Posté le 14-09-2011 à 09:29:28   

Reply

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.

Reply

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 ?

Reply

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 ...

Reply

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)

Reply

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 !!!

Reply

Marsh Posté le 14-09-2011 à 11:17:14    

someoneelseishere a écrit :

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 !!!


 
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.

Reply

Marsh Posté le 14-09-2011 à 11:28:54    

pfiou ... là j'ai plus rien compris  :heink:  
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 :
 

  • J'ai une base de 100.000 clients
  • J'ai besoin de faire des campagnes d'appels téléphoniques ciblés sur une (ou plusieurs) partie(s) de ce portefeuille client
  • J'ai une 10aine de conseillers en charge de cette campagne
  • Chaque client doit être traité
  • Est considéré comme traité un client joint (un répondeur, une absence de réponse, etc ... ne sont donc pas considérés comme des evenements sortant le client de la campagne d'appel)
  • Tant qu'un client n'est pas considéré comme traité, il repasse en bas de la campagne


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 ?


Message édité par someoneelseishere le 14-09-2011 à 11:38:43
Reply

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 ?

Reply

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 !

Message cité 1 fois
Message édité par someoneelseishere le 14-09-2011 à 11:57:27
Reply

Marsh Posté le 14-09-2011 à 11:54:59   

Reply

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 ?

Reply

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

Reply

Marsh Posté le 14-09-2011 à 12:02:15    

la requête telle qu'elle est :
 

Code :
  1. Update tt_campagne Set campagne_flag = '" & ValAlea & "', Campagne_date = Now() WHERE campagne_id in  (select TOP 1 campagne_id from tt_campagne where Campagne_Flag Is Null ORDER BY Campagne_Date);


Message édité par someoneelseishere le 14-09-2011 à 12:02:27
Reply

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?

Reply

Marsh Posté le 14-09-2011 à 15:02:58    

non, le top1 ne peut se faire sur une transaction update.

Reply

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)


Message édité par h4rold le 14-09-2011 à 15:20:29
Reply

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 :)

Reply

Sujets relatifs:

Leave a Replay

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