使用连接的SQL更新查询

Shy*_*yju 630 sql t-sql sql-server sql-server-2005 sql-update

我必须更新一个字段,其值由3个表的连接返回.

例:

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
Run Code Online (Sandbox Code Playgroud)

我想更新mf_item_number表的字段值item_master与在上述条件中连接的其他值.

我怎样才能在MS SQL Server中执行此操作?

gbn*_*gbn 1210

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
Run Code Online (Sandbox Code Playgroud)

为了清楚起见......该UPDATE子句可以引用该子句中指定的表别名FROM.所以im在这种情况下是有效的

通用的例子

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...
Run Code Online (Sandbox Code Playgroud)

  • **FYI**这将*不*在MySQL工作(不同的语法)!对于MySQL,请看一下gcbenison的答案 (8认同)
  • Postgres抱怨`UPDATE im`; 我是Postgres不承认的别名:/ (6认同)
  • @Sliq 谢谢。无论如何,这不是 MySQL 问题。 (2认同)

Rem*_*anu 67

最简单的方法之一是使用公用表表达式(因为您已经在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>
Run Code Online (Sandbox Code Playgroud)

查询执行引擎将自己弄清楚如何更新记录.

  • 非常好,使用CTE可以很容易地将原始SELECT转换为UPDATE (8认同)
  • 只要您的SELECT查询没有任何聚合,DISTINCT等,就可以正常工作. (4认同)

gcb*_*son 61

将其改编为MySQL - 没有任何FROM条款UPDATE,但这有效:

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
Run Code Online (Sandbox Code Playgroud)


Gra*_*tzy 11

没有使用上面的sql,但这里是一个基于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%'
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 8

您可以使用UPDATE语句中的"FROM"子句指定用于确定更新方式和更新内容的其他表,如下所示:

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

在WHERE子句中,您需要提供条件和连接操作以将这些表绑定在一起.

  • ..或在FROM子句中使用ANSI JOINS (5认同)
  • 是的,请使用ansi连接,如果你不小心得到了交叉连接,你可能会在更新中遇到麻烦. (5认同)

Vin*_*shi 7

MySQL:通常,根据您的要求进行必要的更改:

UPDATE
    shopping_cart sc
    LEFT JOIN
    package pc ON sc. package_id = pc.id    
SET
    sc. amount = pc.amount
Run Code Online (Sandbox Code Playgroud)


vis*_*dya 6

在 SQL 中使用 join 查询进行更新非常简单,无需 使用 FROMusing 子句即可完成。这是一个例子:

    UPDATE customer_table c 

      JOIN  
          employee_table e
          ON c.city_id = e.city_id  
      JOIN 
          anyother_ table a
          ON a.someID = e.someID

    SET c.active = "Yes"

    WHERE c.city = "New york";
Run Code Online (Sandbox Code Playgroud)