SQL update query using joins

后端 未结 11 1816
天涯浪人
天涯浪人 2020-11-22 01:15

I have to update a field with a value which is returned by a join of 3 tables.

Example:

select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU         


        
相关标签:
11条回答
  • 2020-11-22 01:32

    You can specify additional tables used in determining how and what to update with the "FROM " clause in the UPDATE statement, like this:

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

    In the WHERE clause, you need to provide the conditions and join operations to bind these tables together.

    Marc

    0 讨论(0)
  • 2020-11-22 01:35

    You can use the following query:

    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 讨论(0)
  • 2020-11-22 01:38
    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
    

    To make it clear... The UPDATE clause can refer to an table alias specified in the FROM clause. So im in this case is valid

    Generic example

    UPDATE A
    SET foo = B.bar
    FROM TableA A
    JOIN TableB B
        ON A.col1 = B.colx
    WHERE ...
    
    0 讨论(0)
  • 2020-11-22 01:40

    You can update with MERGE Command with much more control over MATCHED and NOT MATCHED:(I slightly changed the source code to demonstrate my point)

    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 讨论(0)
  • 2020-11-22 01:41

    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
    
    0 讨论(0)
  • 2020-11-22 01:46

    Did not use your sql above but here is an example of updating a table based on a join statement.

    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%'
    
    0 讨论(0)
提交回复
热议问题