Query di aggiornamento SQL usando i join

Devo aggiornare un campo con un valore che viene restituito da un join di 3 tabelle.

Esempio:

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 

Voglio aggiornare i valori del campo mf_item_number della tabella item_master con qualche altro valore che è unito nella condizione di cui sopra.

Come posso farlo in MS SQL Server?

 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 

Per chiarire … La clausola UPDATE può fare riferimento a un alias di tabella specificato nella clausola FROM . Quindi in questo caso è valido

Esempio generico

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

Uno dei modi più semplici è usare un’espressione di tabella comune (dato che si è già su 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 ,  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 =  

Il motore di esecuzione delle query capirà da solo come aggiornare il record.

Adattandolo a MySQL – non ci sono clausole FROM in UPDATE , ma questo funziona:

 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 

Non ho usato il tuo sql sopra ma qui c’è un esempio di aggiornamento di una tabella basata su una dichiarazione di join.

 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%' 

È ansible specificare tabelle aggiuntive utilizzate per determinare come e cosa aggiornare con la clausola “FROM” nell’istruzione UPDATE, in questo modo:

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

Nella clausola WHERE, è necessario fornire le condizioni e le operazioni di join per unire queste tabelle.

Marc

 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 

Prova così …

 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; 

Puoi aggiornare con MERGE Command con molto più controllo su MATCHED e NOT MATCHED : (ho leggermente modificato il codice sorgente per dimostrare il mio punto)

 USE tempdb; GO IF(OBJECT_ID('target') > 0)DROP TABLE dbo.target IF(OBJECT_ID('source') > 0)DROP TABLE dbo.source CREATE TABLE dbo.Target ( EmployeeID INT , EmployeeName VARCHAR(100) , CONSTRAINT Target_PK PRIMARY KEY ( EmployeeID ) ); CREATE TABLE dbo.Source ( EmployeeID INT , EmployeeName VARCHAR(100) , CONSTRAINT Source_PK PRIMARY KEY ( EmployeeID ) ); GO INSERT dbo.Target ( EmployeeID, EmployeeName ) VALUES ( 100, 'Mary' ); INSERT dbo.Target ( EmployeeID, EmployeeName ) VALUES ( 101, 'Sara' ); INSERT dbo.Target ( EmployeeID, EmployeeName ) VALUES ( 102, 'Stefano' ); GO INSERT dbo.Source ( EmployeeID, EmployeeName ) VALUES ( 100, 'Bob' ); INSERT dbo.Source ( EmployeeID, EmployeeName ) VALUES ( 104, 'Steve' ); GO SELECT * FROM dbo.Source SELECT * FROM dbo.Target MERGE Target AS T USING Source AS S ON ( T.EmployeeID = S.EmployeeID ) WHEN MATCHED THEN UPDATE SET T.EmployeeName = S.EmployeeName + '[Updated]'; GO SELECT '-------After Merge----------' SELECT * FROM dbo.Source SELECT * FROM dbo.Target