2017-10-17 4 views
0

J'ai 2 tables (produits et panier). Le panier est foreign key dans les produits.Mettre à jour le champ dans une table en fonction de sélectionner dans un autre

Lorsque je génère tous les codes pour chaque produit avec le même key(id_cart) étranger j'ai besoin de mettre à jour la ligne correspondante dans le chariot de table, mais seulement si tous les produits avec le même id_cart ont déjà rempli ce champ.

Je voudrais le faire avec une seule requête. C'est possible?

Merci d'avance!

+0

Modifier votre question et de fournir des exemples de données et les résultats souhaités. On dirait que vous pourriez avoir besoin d'un déclencheur. –

Répondre

0

Il y a plusieurs façons de le faire, par exemple quelque chose comme ça update avec having clause:

update cart c set status = 'COMPLETE' 
    where exists (select 1 
        from product p where p.id_cart = c.id 
        having count(1) = count(code)) 

ou merge déclaration:

merge into cart c 
using (select id_cart 
     from product 
     group by id_cart 
     having count(1) = count(code)) p 
on (p.id_cart = c.id) 
when matched then update set status = 'COMPLETE' 

Les données de test:

create table product (id number(3), name varchar2(10), code varchar2(4), id_cart number(3)); 
insert into product values (1, 'pen', 'A', 1); 
insert into product values (2, 'pencil', 'X', 1); 
insert into product values (3, 'box', null, 2); 
insert into product values (4, 'paper', 'Q', 2); 

create table cart (id number(3), status varchar2(10)); 
insert into cart values (1, null); 
insert into cart values (2, null); 

Résultat:

ID STATUS 
--- ---------- 
    1 COMPLETE 
    2 
0

Vous pouvez utiliser la mise à jour-de exemple

UPDATE dbo.Cart 
SET  [fieldToUpdate] = p.fieldToUpdate 
FROM dbo.Cart c 
     JOIN dbo.products p ON c.fk = p.fk 
WHERE cart.id = c.id