tipos - Consulta de actualización de SQL usando uniones
unir consultas horizontalmente sql (9)
Adaptando esto a MySQL - no hay una cláusula FROM
en UPDATE
, pero esto funciona:
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
Tengo que actualizar un campo con un valor que es devuelto por una combinación de 3 tablas.
Ejemplo:
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
Quiero actualizar los valores de campo mf_item_number
de la tabla item_master
con algún otro valor que se une en la condición anterior.
¿Cómo puedo hacer esto en MS SQL Server?
Intenta así ...
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;
No usé su sql arriba, pero aquí hay un ejemplo de actualización de una tabla basada en una declaración de unión.
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%''
Puede especificar tablas adicionales utilizadas para determinar cómo y qué actualizar con la cláusula "FROM" en la instrucción UPDATE, como esto:
update item_master
set mf_item_number = (some value)
from
group_master as gm
join Manufacturar_Master as mm ON ........
where
.... (your conditions here)
En la cláusula WHERE, debe proporcionar las condiciones y las operaciones de unión para unir estas tablas.
Bagazo
Puedes actualizar con MERGE
Command con mucho más control sobre MATCHED
y NOT MATCHED
: (Cambié ligeramente el código fuente para demostrar mi 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
Una de las formas más fáciles es usar una expresión de tabla común (ya que ya está en 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>
El motor de ejecución de consultas descubrirá por sí mismo cómo actualizar el registro.
Puede utilizar la siguiente consulta:
UPDATE im
SET mf_item_number = (some value)
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 `sql`
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
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
Para que quede claro ... La cláusula UPDATE
puede hacer referencia a un alias de tabla especificado en la cláusula FROM
. Así que en este caso im
válido.
Ejemplo genérico
UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
ON A.col1 = B.colx
WHERE ...