SQL更新查询使用连接

我必须用一个值更新一个字段,该值由3个表的连接返回。

示例:

selectim.itemid,im.sku as iSku,gm.SKU as GSKU,mm.ManufacturerId as ManuId,mm.ManufacturerName,im.mf_item_number,mm.ManufacturerIDfromitem_master im, group_master gm, Manufacturer_Master mmwhereim.mf_item_number like 'STA%'and im.sku=gm.skuand gm.ManufacturerID = mm.ManufacturerIDand gm.manufacturerID=34

我想用在上述条件中连接的其他值更新表item_mastermf_item_number字段值。

如何在MSSQLServer中执行此操作?

1058955 次浏览

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

update item_masterset mf_item_number = (some value)fromgroup_master as gmjoin Manufacturar_Master as mm ON ........where.... (your conditions here)

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

马克

UPDATE imSET mf_item_number = gm.SKU --etcFROM item_master imJOIN group_master gmON im.sku = gm.skuJOIN Manufacturer_Master mmON gm.ManufacturerID = mm.ManufacturerIDWHERE im.mf_item_number like 'STA%' ANDgm.manufacturerID = 34

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

通用示例

UPDATE ASET foo = B.barFROM TableA AJOIN TableB BON A.col1 = B.colxWHERE ...

没有使用上面的sql,但这里有一个基于连接语句更新表的示例。

UPDATE pSET    p.category = c.categoryFROM   products pINNER JOIN prodductcatagories pgON  p.productid = pg.productidINNER JOIN categories cON  pg.categoryid = c.cateogryidWHERE  c.categories LIKE 'whole%'

最简单的方法之一是使用公共表表达式(因为您已经在2005年SQL):

with cte as (selectim.itemid,im.sku as iSku,gm.SKU as GSKU,mm.ManufacturerId as ManuId,mm.ManufacturerName,im.mf_item_number,mm.ManufacturerID, <your other field>fromitem_master im, group_master gm, Manufacturer_Master mmwhereim.mf_item_number like 'STA%'and im.sku=gm.skuand gm.ManufacturerID = mm.ManufacturerIDand gm.manufacturerID=34)update cte set mf_item_number = <your other field>

查询执行引擎将自行确定如何更新记录。

使其适应MySQL——UPDATE中没有FROM子句,但这是有效的:

UPDATEitem_master imJOINgroup_master gm ON im.sku=gm.skuJOINManufacturer_Master mm ON gm.ManufacturerID=mm.ManufacturerIDSETim.mf_item_number = gm.SKU --etcWHEREim.mf_item_number like 'STA%'ANDgm.manufacturerID=34

MySQL:一般来说,根据您的要求进行必要的更改:

UPDATEshopping_cart scLEFT JOINpackage pc ON sc. package_id = pc.idSETsc. amount = pc.amount

试试这样…

Update t1.Column1 = valuefrom tbltemp as t1inner join tblUser as t2 on t2.ID = t1.UserIDwhere t1.[column1]=value and t2.[Column1] = value;

您可以使用MERGE命令进行更新,对MATCHEDNOT MATCHED进行更多控制:(我稍微更改了源代码以演示我的观点)

USE tempdb;GOIF(OBJECT_ID('target') > 0)DROP TABLE dbo.targetIF(OBJECT_ID('source') > 0)DROP TABLE dbo.sourceCREATE 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 ));GOINSERT  dbo.Target( EmployeeID, EmployeeName )VALUES  ( 100, 'Mary' );INSERT  dbo.Target( EmployeeID, EmployeeName )VALUES  ( 101, 'Sara' );INSERT  dbo.Target( EmployeeID, EmployeeName )VALUES  ( 102, 'Stefano' );
GOINSERT  dbo.Source( EmployeeID, EmployeeName )VALUES  ( 100, 'Bob' );INSERT  dbo.Source( EmployeeID, EmployeeName )VALUES  ( 104, 'Steve' );GO
SELECT * FROM dbo.SourceSELECT * FROM dbo.Target
MERGE Target AS TUSING Source AS SON ( T.EmployeeID = S.EmployeeID )WHEN MATCHED THENUPDATE SET T.EmployeeName = S.EmployeeName + '[Updated]';GOSELECT '-------After Merge----------'SELECT * FROM dbo.SourceSELECT * FROM dbo.Target

您可以使用以下查询:

UPDATE imSET mf_item_number = (some value)FROM item_master imJOIN group_master gmON im.sku = gm.skuJOIN Manufacturer_Master mmON gm.ManufacturerID = mm.ManufacturerIDWHERE im.mf_item_number like 'STA%' ANDgm.manufacturerID = 34    `sql`

在SQL中使用连接查询进行更新非常简单。您可以在没有使用FROM子句中进行。这是一个示例:

    UPDATE customer_table c
JOINemployee_table eON c.city_id = e.city_idJOINanyother_ table aON a.someID = e.someID
SET c.active = "Yes"
WHERE c.city = "New york";

让我在所有现有答案中添加一个警告:

使用SELECT… from语法时,您应该记住它是T-SQL的专有语法,并且是非确定性。最糟糕的是,您没有收到警告或错误,它只是顺利执行。

完整的示例说明在留档中:

在指定OF子句以提供更新操作的条件时要小心。如果UPDATE语句包含的OF子句未以每次更新的列出现只有一个值可用的方式指定,即UPDATE语句不是确定性的,则UPDATE语句的结果未定义。

如果您使用的是SQLServer,您可以从另一个表更新一个表,而无需指定连接,只需从where子句链接两个表。这使得SQL查询更简单:

 UPDATE Table1SET Table1.col1 = Table2.col1,Table1.col2 = Table2.col2FROMTable2WHERETable1.id = Table2.id

我一直在尝试做这样的事情,我只是想到尝试使用以下语法(使用元组)

update dstTable Tset (T.field1, T.field2, T.field3) =(select S.value1, S.value2, S.value3from srcTable Swhere S.key = T.Key);

令人惊讶的是,它奏效了。我正在使用Oracle(我想是12c)。这是标准SQL还是Oracle特定的?

注意:在我的示例中,我正在更新整个表(填充新列)。更新没有where子句,因此所有行都将被更新。当子查询不返回一行时,您的字段将设置为NULL。(它不能返回多行)。