2011-03-06 3 views
1

Je veux mettre à jour les prix de ces produits qui n'ont pas été achetés par 1 an. Comment je fais ça?Mise à jour et instruction select imbriquée?

Ma requête en cours est:

UPDATE product 
    SET price = price * 0.9 
WHERE date_purchase > SYSDATE - 365 
    AND pid IN ([How do i select the items thats not been purchased in 1year??]); 

J'ai 2 tables:

  • Produit => pid, p_name, etc ... (pid = id produit, p_name = nom du produit)
  • Achat => pid, date_purchase, etc
+0

Avons-nous d'autres tables? Est-ce que ce sont les devoirs? – rene

+0

@rene: 2 tables: Produit et Achat. Non, ce n'est pas un devoir. Je mets plus de détails sur 2 tables dans mes questions éditées – miracle

+0

Note: 1 an n'est pas égal à 365 jours. Pour obtenir il y a un an, vous pouvez utiliser 'ADD_MONTHS (SYSDATE, -12)'. –

Répondre

0

Je pense que cela pourrait se rapprocher

update product 
set price = price * 0.9 
where pid NOT IN (
    select pr.pid 
    from product pr 
    left outer join purchase pu 
    on pu.pid = pr.pid 
    where ((pu.date_purchase != null) 
      AND pu.date_purchase < (SYSDATE - 365)) 
    or pu.pid == null 
); 
2

J'irais avec un NOT EXISTS car il rend l'exigence plus transparente.

update product 
set price = price * 0.9 
where not exists 
    (select 1 from PURCHASE pchase 
    WHERE pchase.pid = PRODUCT.pid 
    and pchase.date_purchase > add_months(sysdate,-12)) 

Bien sûr, vous voulez envisager quoi faire avec des produits qui n'ont été introduites juste (par exemple d'une semaine) et jamais vendus.