Requête de mise à jour SQL pour une requête sélectionnée

J'ai la requête suivante pour listr les employés de deux tables.

J'ai besoin de mettre à jour le a.staffdiscountstartdate à '20100428' comment réécrire la requête suivante pour cela?

select a.employeeid, b.employeeid from tblEmployees a left join tblCards b on a.employeeid=b.employeeid where GroupStartDate < '20100301' and StaffDiscountStartDate > '20100428' and datediff(day,groupstartdate,staffdiscountstartdate)>1 and b.employeeid is null 

Devrait être juste capable de faire:

 UPDATE a SET a.staffdiscountstartdate = '20100428' from tblEmployees a left join tblCards b on a.employeeid=b.employeeid where GroupStartDate < '20100301' and StaffDiscountStartDate > '20100428' and datediff(day,groupstartdate,staffdiscountstartdate)>1 and b.employeeid is null 

MS SQL seulement. Les autres versions SQL ne supportent pas cette syntaxe.

Deux methods

Un:

 update tblEmployees set staffdiscountstartdate = '20100428' where employeeid in ( -- original select query here, remove b.employeeid from the select results ) 

Deux:

 update a set a.staffdiscountstartdate = '20100428' from tblEmployees a left join tblCards b on a.employeeid=b.employeeid where GroupStartDate < '20100301' and StaffDiscountStartDate > '20100428' and datediff(day,groupstartdate,staffdiscountstartdate)>1 and b.employeeid is null 

L'un ou l'autre va fonctionner.

 update tblEmployees set staffdiscountstartdate = '20100428' where employeeid in ( select a.employeeid from tblEmployees a left join tblCards b on a.employeeid=b.employeeid where GroupStartDate < '20100301' and StaffDiscountStartDate > '20100428' and datediff(day,groupstartdate,staffdiscountstartdate)>1 and b.employeeid is null ) 
 Update a Set staffdiscountstartdate = '20100428' --select a.employeeid, b.employeeid from tblEmployees a left join tblCards b on a.employeeid=b.employeeid where GroupStartDate < '20100301' and StaffDiscountStartDate > '20100428' and datediff(day,groupstartdate,staffdiscountstartdate)>1 and b.employeeid is null and a. staffdiscountstartdate <> '20100428' 

J'ai ajouté une clause where supplémentaire comme qui a besoin de mettre à jour la valeur si elle est déjà là correctement. J'ai également montré comment utiliser le select dans le cadre de la mise à jour en commentant la partie select et column list de l'instruction sur une ligne. Cela vous aide à voir que vous avez les loggings corrects avant d'exécuter la mise à jour et je pense qu'il est plus facile de voir comment convertir une déclaration select en une mise à jour.