2010-03-22 6 views
2

J'ai la requête suivante pour lister les employés de deux tables.Requête de mise à jour SQL pour une requête de sélection

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 

Répondre

2

doit ê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 uniquement. Les autres versions SQL ne supportent pas cette syntaxe.

2

Deux méthodes.

One:

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 

Ou fonctionnera.

+0

+1 La première partie est également la même que ma solution (que je vais maintenant supprimer ... sacrément mes doigts lents ...) – amelvin

1
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 
    ) 
+0

+1 - Je vais supprimer ma réponse en double à celle-ci. – amelvin

0
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 qui a besoin de mettre à jour la valeur si elle est déjà 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 enregistrements 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.

Questions connexes