Pesquisa de actualização SQL com ligações

tenho de actualizar um campo com um valor que é devolvido por uma junção de 3 tabelas.

Exemplo:

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

quero actualizar os valores do campo mf_item_number da tabela item_master com algum outro valor que esteja ligado na condição acima.

Como posso fazer isto no servidor de MS SQL?

Author: Andy Jones, 2009-06-11

9 answers

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 fique claro... A cláusula UPDATE pode referir-se a uma alcunha de tabela especificada na cláusula FROM. Então im neste caso é válido

Exemplo Genérico

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...
 1025
Author: gbn, 2016-11-08 15:08:36

Uma das formas mais fáceis é usar uma expressão de tabela comum (uma vez que já está no 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>

O motor de execução da consulta irá descobrir por si só como actualizar o registo.

 61
Author: Remus Rusanu, 2009-06-11 22:04:26

Adaptando isto ao MySQL -- não há nenhuma cláusula FROM em UPDATE, mas isto 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
 56
Author: gcbenison, 2012-08-31 14:41:03

Não usou o seu sql acima, mas aqui está um exemplo de actualização de uma tabela baseada numa declaração de adesão.

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
Author: Gratzy, 2014-12-11 11:51:45

Pode indicar as tabelas adicionais utilizadas para determinar como e o que actualizar com a cláusula " de " na declaração de actualização, do seguinte 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)

Na cláusula onde, você precisa fornecer as condições e unir as operações para ligar estes quadros juntos.

Marc

 7
Author: marc_s, 2009-06-11 19:03:19
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
Author: Vinod Joshi, 2014-08-01 11:28:00
Tenta assim...
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
Author: Ankitkumar Tandel, 2017-03-09 06:53:21

Pode actualizar com MERGE comando com muito mais controlo sobre MATCHED e NOT MATCHED: (alterei ligeiramente o código-fonte para demonstrar o meu ponto de vista)

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
 0
Author: Yashar Aliabasi, 2017-12-21 08:53:03

você pode usar a seguinte 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`
 0
Author: Prasan Karunarathne, 2018-09-05 09:51:22