Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2805 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Update du premier enregistrement correspondant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Update du premier enregistrement correspondant

n°2101419
someoneels​eishere
Posté le 14-09-2011 à 09:29:28  profilanswer
 

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 ?

mood
Publicité
Posté le 14-09-2011 à 09:29:28  profilanswer
 

n°2101436
h4rold
Posté le 14-09-2011 à 10:28:19  profilanswer
 

Il faut que utilises un LIMIT 1 dans ton update. Allié avec MIN ca devrait le faire.

n°2101439
someoneels​eishere
Posté le 14-09-2011 à 10:33:11  profilanswer
 

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 ?

n°2101448
someoneels​eishere
Posté le 14-09-2011 à 10:52:33  profilanswer
 

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

n°2101451
h4rold
Posté le 14-09-2011 à 11:08:29  profilanswer
 

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)

n°2101453
someoneels​eishere
Posté le 14-09-2011 à 11:11:53  profilanswer
 

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

n°2101455
h4rold
Posté le 14-09-2011 à 11:17:14  profilanswer
 

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.

n°2101461
someoneels​eishere
Posté le 14-09-2011 à 11:28:54  profilanswer
 

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
n°2101469
h4rold
Posté le 14-09-2011 à 11:51:44  profilanswer
 

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 ?

n°2101471
someoneels​eishere
Posté le 14-09-2011 à 11:54:59  profilanswer
 

..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
mood
Publicité
Posté le 14-09-2011 à 11:54:59  profilanswer
 

n°2101473
h4rold
Posté le 14-09-2011 à 11:56:45  profilanswer
 

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 ?

n°2101477
someoneels​eishere
Posté le 14-09-2011 à 12:00:07  profilanswer
 

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

n°2101479
someoneels​eishere
Posté le 14-09-2011 à 12:02:15  profilanswer
 

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
n°2101516
Oliiii
Posté le 14-09-2011 à 14:51:02  profilanswer
 

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?

n°2101521
someoneels​eishere
Posté le 14-09-2011 à 15:02:58  profilanswer
 

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

n°2101528
h4rold
Posté le 14-09-2011 à 15:19:05  profilanswer
 

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
n°2101547
Oliiii
Posté le 14-09-2011 à 16:38:57  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Update du premier enregistrement correspondant

 

Sujets relatifs
[RESOLU] insert/update ifnull/ifnotnullCréation page web avec update automatique du contenu
[MySQL ]Problème sur ON DUPLICATE KEY UPDATETrigger sur un update
[SQL] Update & Group byJeux d'enregistrement Dreamweaver
[Résolu] " update or insert " selon une conditionajouter liste déroulante dans un formulaire d'enregistrement
formulaire d'enregistrement et récupération de donnéesSQL : concaténer champ et enlever espace UPDATE
Plus de sujets relatifs à : Update du premier enregistrement correspondant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR