Question Requête de mise à jour SQL utilisant des joint


Je dois mettre à jour un champ avec une valeur qui est retournée par une jointure de 3 tables.

Exemple:

select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34

Je veux mettre à jour le mf_item_number valeurs de champ de la table item_master avec une autre valeur qui est jointe dans la condition ci-dessus.

Comment puis-je faire cela dans MS SQL Server?


523
2018-06-11 18:49


origine


Réponses:


UPDATE im
SET mf_item_number = gm.SKU --etc
FROM item_master im
JOIN group_master gm
    ON im.sku = gm.sku 
JOIN Manufacturer_Master mm
    ON gm.ManufacturerID = mm.ManufacturerID
WHERE im.mf_item_number like 'STA%' AND
      gm.manufacturerID = 34

Pour le rendre clair ... UPDATE clause peut faire référence à un alias de table spécifié dans le FROM clause. Alors im dans ce cas est valide

Exemple générique

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...

994
2018-06-11 18:55



L'un des moyens les plus simples consiste à utiliser une expression de table commune (puisque vous êtes déjà sur SQL 2005):

with cte as (
select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
    , <your other field>
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34)
update cte set mf_item_number = <your other field>

Le moteur d'exécution de la requête déterminera lui-même comment mettre à jour l'enregistrement.


61
2018-06-11 22:04



Adaptation à MySQL - il n'y a pas FROM clause dans UPDATE, mais cela fonctionne:

UPDATE
    item_master im
    JOIN
    group_master gm ON im.sku=gm.sku 
    JOIN
    Manufacturer_Master mm ON gm.ManufacturerID=mm.ManufacturerID
SET
    im.mf_item_number = gm.SKU --etc
WHERE
    im.mf_item_number like 'STA%'
    AND
    gm.manufacturerID=34

53
2018-03-18 02:57



N'a pas utilisé votre sql ci-dessus mais voici un exemple de mise à jour d'une table basée sur une déclaration de jointure.

UPDATE p
SET    p.category = c.category
FROM   products p
       INNER JOIN prodductcatagories pg
            ON  p.productid = pg.productid
       INNER JOIN categories c
            ON  pg.categoryid = c.cateogryid
WHERE  c.categories LIKE 'whole%'

9
2018-06-11 19:02



Vous pouvez spécifier des tables supplémentaires utilisées pour déterminer comment et quoi mettre à jour avec la clause "FROM" dans l'instruction UPDATE, comme ceci:

update item_master
set mf_item_number = (some value)
from 
   group_master as gm
   join Manufacturar_Master as mm ON ........
where
 .... (your conditions here)

Dans la clause WHERE, vous devez fournir les conditions et les opérations de jointure pour lier ces tables ensemble.

Marc


7
2018-06-11 18:55



MySQL: In general, make necessary changes par your requirement:

UPDATE
    shopping_cart sc
    LEFT JOIN
    package pc ON sc. package_id = pc.id    
SET
    sc. amount = pc.amount

4
2017-08-01 11:28



Essayez comme ça ...

Update t1.Column1 = value 
from tbltemp as t1 
inner join tblUser as t2 on t2.ID = t1.UserID 
where t1.[column1]=value and t2.[Column1] = value;

2
2017-12-01 12:02